From 79484a43c2a4c984b9cb9e0290805822d6d6a275 Mon Sep 17 00:00:00 2001 From: dengn <4965857+dengn@users.noreply.github.com> Date: Sun, 18 Oct 2026 14:24:31 +0800 Subject: [PATCH 1/5] feat(mv): persist refresh semantics and converge bounded maintenance Integrate native materialized views onto main 3fc00709, retaining published migration and capability owners. Capture versioned binding context, preserve MV scan admission under LIMIT 0, and drain bounded history pages through the existing task owner. Keep atomic native publication and legacy read access. Related to #30079. Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> Co-authored-by: dengn Co-authored-by: XuPeng-SH --- cmd/mo-service/materialized_view_faults.go | 36 + docs/design/explain_format_json.md | 12 + .../materialized_view_behavior_results.json | 126 + .../materialized_view_ci_bridge_results.json | 89 + ...materialized_view_ci_coverage_results.json | 69 + .../materialized_view_ci_port_results.json | 76 + docs/design/materialized_view_ci_results.json | 327 + docs/design/materialized_view_ci_triage.md | 943 + .../materialized_view_native_recovery.md | 157 + ...rialized_view_native_recovery_results.json | 1113 + ...materialized_view_performance_results.json | 538 + ...materialized_view_publication_results.json | 625 + .../materialized_view_recovery_self_review.md | 207 + .../materialized_view_reference_manifest.json | 84 + docs/design/materialized_view_results.md | 105 + ...ialized_view_review_lifecycle_results.json | 101 + docs/design/materialized_view_self_review.md | 353 + .../materialized_view_semantic_context_v2.md | 43 + ...erialized_view_task_admission_results.json | 139 + docs/design/materialized_view_validation.md | 310 + docs/rfcs/00000000_materialized_views.md | 916 + etc/launch-tae-compose/compose.yaml | 4 +- optools/materialized_view_recovery.py | 394 + optools/run_bvt_group.sh | 10 + optools/run_materialized_view_bvt.sh | 64 + .../service_statistics_upgrade_test.go | 5 + pkg/bootstrap/upgrade.go | 2 + pkg/bootstrap/versions/v4_0_17/upgrade.go | 84 + .../versions/v4_0_17/upgrade_test.go | 85 + pkg/catalog/materialized_view.go | 197 + pkg/catalog/materialized_view_test.go | 106 + pkg/cnservice/server.go | 2 + pkg/cnservice/server_task.go | 24 +- pkg/cnservice/server_task_test.go | 66 + pkg/defines/const.go | 3 +- pkg/defines/materialized_view.go | 93 + pkg/defines/materialized_view_test.go | 51 + pkg/frontend/authenticate.go | 59 +- pkg/frontend/authenticate_test.go | 9 + pkg/frontend/internal_executor.go | 2 + pkg/frontend/internal_executor_test.go | 35 + pkg/frontend/materialized_view.go | 448 + pkg/frontend/materialized_view_test.go | 192 + pkg/frontend/mysql_cmd_executor.go | 10 + pkg/frontend/pitr.go | 3 + pkg/frontend/self_handle.go | 16 + pkg/frontend/snapshot.go | 24 +- pkg/frontend/snapshot_catalog_restore_test.go | 22 + pkg/frontend/snapshot_test.go | 2 + pkg/frontend/status_stmt.go | 2 +- pkg/frontend/stmt_kind.go | 4 + pkg/frontend/variables.go | 4 + pkg/mv/service.go | 432 + pkg/mv/service_test.go | 398 + pkg/mv/task.go | 259 + pkg/mv/task_test.go | 547 + pkg/pb/task/task.pb.go | 220 +- pkg/sql/colexec/insert/insert.go | 10 + .../colexec/insert/materialized_view_test.go | 43 + .../multi_update/materialized_view_test.go | 42 + pkg/sql/colexec/multi_update/multi_update.go | 10 + pkg/sql/compile/alter.go | 5 + pkg/sql/compile/compile.go | 23 +- pkg/sql/compile/ddl.go | 28 + pkg/sql/compile/lifecycle_fk_scope.go | 7 + pkg/sql/compile/materialized_view.go | 281 + pkg/sql/compile/materialized_view_test.go | 317 + pkg/sql/compile/scheduler.go | 4 + pkg/sql/compile/sql_executor.go | 2 +- pkg/sql/compile/sql_executor_context.go | 3 +- pkg/sql/compile/sql_executor_context_test.go | 6 +- pkg/sql/compile/union_all_lazy_test.go | 14 + pkg/sql/parsers/dialect/mysql/keywords.go | 6 + .../dialect/mysql/materialized_view_test.go | 72 + pkg/sql/parsers/dialect/mysql/mysql_sql.go | 31387 ++++++++-------- pkg/sql/parsers/dialect/mysql/mysql_sql.y | 50 +- pkg/sql/parsers/tree/materialized_view.go | 119 + pkg/sql/plan/build.go | 2 + pkg/sql/plan/build_constraint_util.go | 9 + pkg/sql/plan/build_ddl.go | 6 + pkg/sql/plan/build_dml_util.go | 4 +- pkg/sql/plan/build_show.go | 2 +- pkg/sql/plan/build_table_clone.go | 3 + pkg/sql/plan/explain/sql_json_test.go | 56 + pkg/sql/plan/materialized_view.go | 263 + pkg/sql/plan/materialized_view_test.go | 247 + pkg/sql/plan/nullif_rebind_test.go | 3 + pkg/sql/plan/query_builder.go | 5 + pkg/tests/issues/issue_29400_test.go | 5 +- .../materialized_view_semantics_test.go | 230 + pkg/util/executor/options.go | 7 + pkg/util/executor/types.go | 1 + proto/task.proto | 2 + .../cases/dml/select/sp_table.result | 4 + .../cases/dml/show/database_statistics.result | 4 +- test/distributed/cases/dml/show/show.result | 6 +- .../clone_sys_db_table_to_new_db_table.result | 8 + .../cases/mo_cloud/mo_cloud.result | 4 + .../cluster/restore_cluster_table.result | 8 + ...ster_level_snapshot_restore_cluster.result | 8 + .../privilege/create_user_default_role.result | 4 + .../cases/view/materialized_view.result | 114 + .../cases/view/materialized_view.sql | 65 + .../zz_accesscontrol/create_account.result | 4 + test/materialized_view/README.md | 154 + test/materialized_view/additional.go | 596 + test/materialized_view/catalog.go | 47 + test/materialized_view/main.go | 336 + test/materialized_view/multi_cn.go | 169 + test/materialized_view/native_probe/check.py | 54 + test/materialized_view/native_probe/main.go | 103 + test/materialized_view/performance.go | 57 + 112 files changed, 29539 insertions(+), 15727 deletions(-) create mode 100644 cmd/mo-service/materialized_view_faults.go create mode 100644 docs/design/materialized_view_behavior_results.json create mode 100644 docs/design/materialized_view_ci_bridge_results.json create mode 100644 docs/design/materialized_view_ci_coverage_results.json create mode 100644 docs/design/materialized_view_ci_port_results.json create mode 100644 docs/design/materialized_view_ci_results.json create mode 100644 docs/design/materialized_view_ci_triage.md create mode 100644 docs/design/materialized_view_native_recovery.md create mode 100644 docs/design/materialized_view_native_recovery_results.json create mode 100644 docs/design/materialized_view_performance_results.json create mode 100644 docs/design/materialized_view_publication_results.json create mode 100644 docs/design/materialized_view_recovery_self_review.md create mode 100644 docs/design/materialized_view_reference_manifest.json create mode 100644 docs/design/materialized_view_results.md create mode 100644 docs/design/materialized_view_review_lifecycle_results.json create mode 100644 docs/design/materialized_view_self_review.md create mode 100644 docs/design/materialized_view_semantic_context_v2.md create mode 100644 docs/design/materialized_view_task_admission_results.json create mode 100644 docs/design/materialized_view_validation.md create mode 100644 docs/rfcs/00000000_materialized_views.md create mode 100644 optools/materialized_view_recovery.py create mode 100644 optools/run_materialized_view_bvt.sh create mode 100644 pkg/bootstrap/versions/v4_0_17/upgrade.go create mode 100644 pkg/bootstrap/versions/v4_0_17/upgrade_test.go create mode 100644 pkg/catalog/materialized_view.go create mode 100644 pkg/catalog/materialized_view_test.go create mode 100644 pkg/defines/materialized_view.go create mode 100644 pkg/defines/materialized_view_test.go create mode 100644 pkg/frontend/materialized_view.go create mode 100644 pkg/frontend/materialized_view_test.go create mode 100644 pkg/mv/service.go create mode 100644 pkg/mv/service_test.go create mode 100644 pkg/mv/task.go create mode 100644 pkg/mv/task_test.go create mode 100644 pkg/sql/colexec/insert/materialized_view_test.go create mode 100644 pkg/sql/colexec/multi_update/materialized_view_test.go create mode 100644 pkg/sql/compile/materialized_view.go create mode 100644 pkg/sql/compile/materialized_view_test.go create mode 100644 pkg/sql/parsers/dialect/mysql/materialized_view_test.go create mode 100644 pkg/sql/parsers/tree/materialized_view.go create mode 100644 pkg/sql/plan/materialized_view.go create mode 100644 pkg/sql/plan/materialized_view_test.go create mode 100644 pkg/tests/sqlintegration/materialized_view_semantics_test.go create mode 100644 test/distributed/cases/view/materialized_view.result create mode 100644 test/distributed/cases/view/materialized_view.sql create mode 100644 test/materialized_view/README.md create mode 100644 test/materialized_view/additional.go create mode 100644 test/materialized_view/catalog.go create mode 100644 test/materialized_view/main.go create mode 100644 test/materialized_view/multi_cn.go create mode 100644 test/materialized_view/native_probe/check.py create mode 100644 test/materialized_view/native_probe/main.go create mode 100644 test/materialized_view/performance.go diff --git a/cmd/mo-service/materialized_view_faults.go b/cmd/mo-service/materialized_view_faults.go new file mode 100644 index 0000000000000..538f00ed1af6a --- /dev/null +++ b/cmd/mo-service/materialized_view_faults.go @@ -0,0 +1,36 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build matrixone_mv_faults + +package main + +import ( + "context" + "os" + + "github.com/matrixorigin/matrixone/pkg/util/fault" +) + +// Only the explicitly instrumented native recovery binary accepts startup +// faults. Production builds have no environment-controlled injection path. +// Startup injection is needed because ordinary login cannot precede migration. +func init() { + if point := os.Getenv("MO_MV_STARTUP_FAULT"); point != "" { + fault.Enable() + if result := fault.HandleFaultInject(context.Background(), fault.AddFault, point); result != "OK" { + panic(result) + } + } +} diff --git a/docs/design/explain_format_json.md b/docs/design/explain_format_json.md index 3bea4a65c1828..071cd92f7b229 100644 --- a/docs/design/explain_format_json.md +++ b/docs/design/explain_format_json.md @@ -395,3 +395,15 @@ MySQL optimizer choices. Run focused UT, package regression, a single-CN protocol/BVT pass, and local scale fixtures. CGo package runs and a fixed MySQL 8.0.45 capture remain explicit QA evidence; they are not replaced by a successful text EXPLAIN comparison. + + +### Index search protocol compatibility + +The renderer consumes `INDEX_SEARCH_SCAN` / `IndexSearchScan`, including the +common `QueryPayload` and named `algo_exprs`. Vector output retains the +`query_vector` label; fulltext output uses `query_payload`. Algorithm descriptions come from +the existing search plugin `ExplainHooks`; the SQL layer does not decode +algorithm-specific options. The existing `algo_options=0x…` expression preserves opaque option bytes, +including settings not described by the hook and unregistered plugins. Expression names and +values must have matching lengths and nonempty names; malformed metadata or +plugin options produce an error instead of partial output. diff --git a/docs/design/materialized_view_behavior_results.json b/docs/design/materialized_view_behavior_results.json new file mode 100644 index 0000000000000..f08c81fed38c8 --- /dev/null +++ b/docs/design/materialized_view_behavior_results.json @@ -0,0 +1,126 @@ +{ + "baseline": "dd38098853ea197699ed3fac3e69dc53975ac061", + "scope": "Local uncommitted experimental P1 task tree; not a release or full CI result", + "total_sql_checks": 83, + "runs": { + "main": { + "started": "2026-10-13T01:45:19.600848901Z", + "passed_cases": [ + "experimental gate", + "deferred population", + "NULL and aggregate semantics", + "independent typed aggregate oracle", + "last committed materialization", + "insert update delete refresh", + "read only: insert into totals(k) values(4)", + "read only: update totals set k=4", + "read only: delete from totals", + "read only: truncate table totals", + "read only: replace into totals(k) values(4)", + "read only: alter table totals add x int", + "read only: drop table totals", + "dependency restrict: alter table facts add x int", + "dependency restrict: truncate table facts", + "dependency restrict: drop table facts", + "dependency restrict: drop database mv_validation", + "failed DROP preserves current database", + "unsupported definition: select rand() from facts", + "unsupported definition: select now() from facts", + "unsupported definition: select distinct k from facts", + "unsupported definition: select count(distinct k) from facts", + "unsupported definition: select * from facts limit 1", + "unsupported definition: select row_number() over(order by id) from facts", + "unsupported definition: select * from totals", + "inner join refresh", + "empty aggregate", + "refresh in user transaction", + "SHOW CREATE", + "scheduled refresh", + "SHOW state and full source timestamp", + "refresh history", + "repeat refresh idempotent rows", + "IF NOT EXISTS no replacement", + "object kind collision", + "duplicate output heading", + "minimum schedule interval", + "MV nesting", + "outer join", + "random sample", + "temporary source", + "grouped empty has zero rows", + "all NULL typed oracle", + "projection and filter", + "dimension mutation", + "captured SQL mode", + "captured fixed-offset timezone", + "create MV in user transaction", + "rename dependent source", + "foreign key into MV", + "prepared read after refresh", + "concurrent readers see complete publications", + "concurrent refresh publication", + "MV grant requires source SELECT", + "MV plus source grant permits read", + "prepared source ACL revocation", + "nonowner refresh rejected", + "nonowner drop rejected", + "SHOW owner isolation", + "same-name multi-tenant source and MV isolation", + "cancelled client read", + "benchmark result equality", + "B02 explicit rollup result equality", + "B03 repeated join result equality", + "B05 high cardinality control result equality", + "retained restart fixture" + ], + "case_count": 66, + "error": null, + "original_path": "/workspace/mv-build/sql-results.json", + "original_sha256": "945ccd677c7cc51759213317e1c331aa3514d93f5784971f63f0d9cb179fd0b7" + }, + "restart": { + "started": "2026-10-13T01:54:39.063860599Z", + "passed_cases": [ + "restart persisted materialization", + "restart persisted history", + "refresh after restart" + ], + "case_count": 3, + "error": null, + "original_path": "/workspace/mv-build/restart-results.json", + "original_sha256": "f7c712f166cfab37860d8acd3e9abd4b4913b790f697f225442248d2128949d2" + }, + "failure_cleanup": { + "started": "2026-10-13T02:00:19.368962039Z", + "passed_cases": [ + "native source-expression refresh failure", + "native failed refresh preserves rows", + "native failed refresh diagnostic", + "drop removes MV state", + "dependency cleanup permits database drop" + ], + "case_count": 5, + "error": null, + "original_path": "/workspace/mv-build/edge-results.json", + "original_sha256": "e0451e119910f6d5ecc8ab369badf578895b36483c520467bd2b1122f2b3cfa0" + }, + "two_cn": { + "started": "2026-10-13T02:29:15.62628679Z", + "passed_cases": [ + "second CN rejects unpopulated view", + "cross-CN publication visibility", + "second CN can refresh independently", + "two-CN concurrent publication version 2", + "two-CN concurrent publication version 3", + "two-CN concurrent publication version 4", + "two-CN concurrent publication version 5", + "two-CN concurrent publication version 6", + "cross-CN terminal history" + ], + "case_count": 9, + "error": null, + "original_path": "/workspace/mv-build/multi-cn-results.json", + "original_sha256": "2983df0dcb8a71793d6def3853e2d07acebc5c24b89a47faded1d9987823452c" + } + } +} diff --git a/docs/design/materialized_view_ci_bridge_results.json b/docs/design/materialized_view_ci_bridge_results.json new file mode 100644 index 0000000000000..2cacd1a4299f0 --- /dev/null +++ b/docs/design/materialized_view_ci_bridge_results.json @@ -0,0 +1,89 @@ +{ + "baseline": "cd5de147d5043ff1795bfb430714afcc9019f144", + "merged_main": "9f873692e0efa869c64c4d1c84e212c5a8a3272a", + "change": "merge upstream collation protocol 117 and require MV protocol 118", + "consumer": "optools/run_materialized_view_bvt.sh", + "topology": "same two-CN native production instance, separate CN processes sharing TN/LOG", + "runs": [ + { + "run": 1, + "exit": 0, + "native_checks": { + "functional": 70, + "failure": 5, + "multi-cn": 9 + }, + "bridge": { + "runs": [ + { + "passed_requests": 9, + "process_exit": 0 + }, + { + "passed_requests": 9, + "process_exit": 0 + } + ] + }, + "teardown": { + "database": 0, + "definitions": 0, + "dependencies": 0, + "runs": 0, + "tasks": 0 + } + }, + { + "run": 2, + "exit": 0, + "native_checks": { + "functional": 70, + "failure": 5, + "multi-cn": 9 + }, + "bridge": { + "runs": [ + { + "passed_requests": 9, + "process_exit": 0 + }, + { + "passed_requests": 9, + "process_exit": 0 + } + ] + }, + "teardown": { + "database": 0, + "definitions": 0, + "dependencies": 0, + "runs": 0, + "tasks": 0 + } + } + ], + "normal_service_sha256": "aeb4a698e56a66666d30f1dc2f69bcebcac33f6d32b32873be5d99004181341f", + "native_service_vcs": "/tmp/mo-service-mv-protocol118-production: go1.27.1\n\tpath\tgithub.com/matrixorigin/matrixone/cmd/mo-service\n\tmod\tgithub.com/matrixorigin/matrixone\tv0.0.0-20261016075419-cd5de147d504+dirty\t\n\tdep\tfilippo.io/edwards25519\tv1.1.1\th1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw=\n\tdep\tgithub.com/BurntSushi/toml\tv1.2.1\th1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=\n\tdep\tgithub.com/DataDog/zstd\tv1.5.0\th1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo=\n\tdep\tgithub.com/FastFilter/xorfilter\tv0.5.1\th1:UjtPttI1SnKWUmeQKu8Y+4ZvMJv7KP6/NZTsGBPQY08=\n\tdep\tgithub.com/KimMachineGun/automemlimit\tv0.6.0\th1:p/BXkH+K40Hax+PuWWPQ478hPjsp9h1CPDhLlA3Z37E=\n\tdep\tgithub.com/Masterminds/semver/v3\tv3.2.1\th1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=\n\tdep\tgithub.com/RoaringBitmap/roaring/v2\tv2.16.0\th1:Kys1UNf49d5W8Tq3bpuAhIr/Z8/yPB+59CO8A6c/BbE=\n\tdep\tgithub.com/VictoriaMetrics/metrics\tv1.18.1\th1:OZ0+kTTto8oPfHnVAnTOoyl0XlRhRkoQrD2n2cOuRw0=\n\tdep\tgithub.com/alibabacloud-go/debug\tv1.0.1\th1:MsW9SmUtbb1Fnt3ieC6NNZi6aEwrXfDksD4QA6GSbPg=\n\tdep\tgithub.com/alibabacloud-go/tea\tv1.2.2\th1:aTsR6Rl3ANWPfqeQugPglfurloyBJY85eFy7Gc1+8oU=\n\tdep\tgithub.com/aliyun/alibaba-cloud-sdk-go\tv1.63.34\th1:eZM2MHY/p4TFO1pGf9O5HiuYE59hwrrkf3HvCtkL5Ok=\n\tdep\tgithub.com/aliyun/aliyun-oss-go-sdk\tv3.0.2+incompatible\th1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g=\n\tdep\tgithub.com/aliyun/credentials-go\tv1.3.10\th1:45Xxrae/evfzQL9V10zL3xX31eqgLWEaIdCoPipOEQA=\n\tdep\tgithub.com/andres-erbsen/clock\tv0.0.0-20160526145045-9e14626cd129\th1:MzBOUgng9orim59UnfUTLRjMpd09C5uEVQ6RPGeCaVI=\n\tdep\tgithub.com/andybalholm/brotli\tv1.2.2\th1:HzTuoo2ErYQqf5qvcJInB8uvqSVxRttzkFexPWtnceM=\n\tdep\tgithub.com/apache/arrow-go/v18\tv18.7.0\th1:Vw/i+cJyebUofT7JlqFpe65LrmwxULn166jjwStM4HY=\n\tdep\tgithub.com/armon/go-metrics\tv0.4.1\th1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\n\tdep\tgithub.com/aws/aws-sdk-go\tv1.55.5\th1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=\n\tdep\tgithub.com/aws/aws-sdk-go-v2\tv1.41.5\th1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/aws/protocol/eventstream\tv1.7.8\th1:eBMB84YGghSocM7PsjmmPffTa+1FBUeNvGvFou6V/4o=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/config\tv1.32.14\th1:opVIRo/ZbbI8OIqSOKmpFaY7IwfFUOCCXBsUpJOwDdI=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/credentials\tv1.19.14\th1:n+UcGWAIZHkXzYt87uMFBv/l8THYELoX6gVcUvgl6fI=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/feature/ec2/imds\tv1.18.21\th1:NUS3K4BTDArQqNu2ih7yeDLaS3bmHD0YndtA6UP884g=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/configsources\tv1.4.21\th1:Rgg6wvjjtX8bNHcvi9OnXWwcE0a2vGpbwmtICOsvcf4=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/endpoints/v2\tv2.7.21\th1:PEgGVtPoB6NTpPrBgqSE5hE/o47Ij9qk/SEZFbUOe9A=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/ini\tv1.8.6\th1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/v4a\tv1.4.22\th1:rWyie/PxDRIdhNf4DzRk0lvjVOqFJuNnO8WwaIRVxzQ=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/accept-encoding\tv1.13.7\th1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/checksum\tv1.9.13\th1:JRaIgADQS/U6uXDqlPiefP32yXTda7Kqfx+LgspooZM=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/presigned-url\tv1.13.21\th1:c31//R3xgIJMSC8S6hEVq+38DcvUlgFY0FM6mSI5oto=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/s3shared\tv1.19.21\th1:ZlvrNcHSFFWURB8avufQq9gFsheUgjVD9536obIknfM=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/s3\tv1.99.0\th1:hlSuz394kV0vhv9drL5lhuEFbEOEP1VyQpy15qWh1Pk=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/signin\tv1.0.9\th1:QKZH0S178gCmFEgst8hN0mCX1KxLgHBKKY/CLqwP8lg=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/sso\tv1.30.15\th1:lFd1+ZSEYJZYvv9d6kXzhkZu07si3f+GQ1AaYwa2LUM=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/ssooidc\tv1.35.19\th1:dzztQ1YmfPrxdrOiuZRMF6fuOwWlWpD2StNLTceKpys=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/sts\tv1.41.10\th1:p8ogvvLugcR/zLBXTXrTkj0RYBUdErbMnAFFp12Lm/U=\n\tdep\tgithub.com/aws/smithy-go\tv1.24.3\th1:XgOAaUgx+HhVBoP4v8n6HCQoTRDhoMghKqw4LNHsDNg=\n\tdep\tgithub.com/axiomhq/hyperloglog\tv0.2.6\th1:sRhvvF3RIXWQgAXaTphLp4yJiX4S0IN3MWTaAgZoRJw=\n\tdep\tgithub.com/beorn7/perks\tv1.0.1\th1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\n\tdep\tgithub.com/bits-and-blooms/bitset\tv1.24.2\th1:M7/NzVbsytmtfHbumG+K2bremQPMJuqv1JD3vOaFxp0=\n\tdep\tgithub.com/blevesearch/mmap-go\tv1.2.0\th1:l33nNKPFcBjJUMwem6sAYJPUzhUCABoK9FxZDGiFNBI=\n\tdep\tgithub.com/blevesearch/vellum\tv1.2.0\th1:xkDiOEsHc2t3Cp0NsNZZ36pvc130sCzcGKOPMzXe+e0=\n\tdep\tgithub.com/buger/jsonparser\tv1.1.2\th1:frqHqw7otoVbk5M8LlE/L7HTnIq2v9RX6EJ48i9AxJk=\n\tdep\tgithub.com/bytedance/gopkg\tv0.1.3\th1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M=\n\tdep\tgithub.com/bytedance/sonic\tv1.15.2\th1:90H+rcF/FwLXwfB1cudOLq/je83n683Utf4Cbp0xHCo=\n\tdep\tgithub.com/cespare/xxhash/v2\tv2.3.0\th1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\n\tdep\tgithub.com/cilium/ebpf\tv0.21.0\th1:4dpx1J/B/1apeTmWBH5BkVLayHTkFrMovVPnHEk+l3k=\n\tdep\tgithub.com/clbanning/mxj\tv1.8.4\th1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I=\n\tdep\tgithub.com/clipperhouse/uax29/v2\tv2.7.0\th1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk=\n\tdep\tgithub.com/cockroachdb/errors\tv1.9.1\th1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8=\n\tdep\tgithub.com/cockroachdb/logtags\tv0.0.0-20230118201751-21c54148d20b\th1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=\n\tdep\tgithub.com/cockroachdb/pebble\tv0.0.0-20220407171941-2120d145e292\th1:7fLxcRpQTdi1iic0cIUpK+hKKLM5XdPhEbWRRrxfvLU=\n\tdep\tgithub.com/cockroachdb/redact\tv1.1.3\th1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ=\n\tdep\tgithub.com/colinmarc/hdfs/v2\tv2.4.0\th1:v6R8oBx/Wu9fHpdPoJJjpGSUxo8NhHIwrwsfhFvU9W0=\n\tdep\tgithub.com/containerd/cgroups/v3\tv3.1.3\th1:eUNflyMddm18+yrDmZPn3jI7C5hJ9ahABE5q6dyLYXQ=\n\tdep\tgithub.com/containerd/log\tv0.1.0\th1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=\n\tdep\tgithub.com/coreos/go-systemd/v22\tv22.7.0\th1:LAEzFkke61DFROc7zNLX/WA2i5J8gYqe0rSj9KI28KA=\n\tdep\tgithub.com/cpegeric/pdftotext-go\tv0.0.0-20241112123704-49cb86a3790e\th1:tQSCiEjYPRU+AuuVR+zd+xYVOsEqX1clPhmIAM6FCHU=\n\tdep\tgithub.com/davecgh/go-spew\tv1.1.2-0.20180830191138-d8f796af33cc\th1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\n\tdep\tgithub.com/detailyang/go-fallocate\tv0.0.0-20180908115635-432fa640bd2e\th1:lj77EKYUpYXTd8CD/+QMIf8b6OIOTsfEBSXiAzuEHTU=\n\tdep\tgithub.com/dgryski/go-metro\tv0.0.0-20250106013310-edb8663e5e33\th1:ucRHb6/lvW/+mTEIGbvhcYU3S8+uSNkuMjx/qZFfhtM=\n\tdep\tgithub.com/dlclark/regexp2\tv1.10.0\n\t=>\tgithub.com/XuPeng-SH/regexp2\tv1.10.1-0.20261004024751-718f43e031fe\th1:7TlZYr/D2KQlZ2lwGehHN7Ix3ICj43OXaZx2UT4DOIo=\n\t\n\tdep\tgithub.com/docker/go-units\tv0.5.0\th1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=\n\tdep\tgithub.com/dolthub/maphash\tv0.1.0\th1:bsQ7JsF4FkkWyrP3oCnFJgrCUAFbFf3kOl4L/QxPDyQ=\n\tdep\tgithub.com/dslipak/pdf\tv0.0.2\th1:djAvcM5neg9Ush+zR6QXB+VMJzR6TdnX766HPIg1JmI=\n\tdep\tgithub.com/dustin/go-humanize\tv1.0.1\th1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=\n\tdep\tgithub.com/dylibso/observe-sdk/go\tv0.0.0-20240819160327-2d926c5d788a\th1:UwSIFv5g5lIvbGgtf3tVwC7Ky9rmMFBp0RMs+6f6YqE=\n\tdep\tgithub.com/elastic/elastic-transport-go/v8\tv8.6.0\th1:Y2S/FBjx1LlCv5m6pWAF2kDJAHoSjSRSJCApolgfthA=\n\tdep\tgithub.com/elastic/go-elasticsearch/v8\tv8.15.0\th1:IZyJhe7t7WI3NEFdcHnf6IJXqpRf+8S8QWLtZYYyBYk=\n\tdep\tgithub.com/elastic/gosigar\tv0.14.2\n\t=>\tgithub.com/matrixorigin/gosigar\tv0.14.3-0.20241204071856-40aab500bfac\th1:KRPOwOcSZRfWT7w8mr7BmFLoFB75ljgqjkg47xkN/Pc=\n\t\n\tdep\tgithub.com/extism/go-sdk\tv1.6.0\th1:crFRMhjcPAn6R9M4eIvkjHQs7CLBs3yzPqwnj+uwzdg=\n\tdep\tgithub.com/fagongzi/goetty/v2\tv2.0.3-0.20230628075727-26c9a2fd5fb8\n\t=>\tgithub.com/matrixorigin/goetty/v2\tv2.0.0-20260811155919-8edc32ac370a\th1:D8kXjySDJHA8nyZzzi/4cx3KB6qrSPQeugUCLkgoEho=\n\t\n\tdep\tgithub.com/fagongzi/util\tv0.0.0-20210923134909-bccc37b5040d\th1:1pILVCatHj3eVo9i52dZyY4BwjTmSIeN+/hoJh8rD0Y=\n\tdep\tgithub.com/felixge/fgprof\tv0.9.6-0.20240831122612-49987e680f04\th1:6exK5FZYMJwsXo4xGqax5rdCHCYeQz+zgTO+Sk+tNHE=\n\tdep\tgithub.com/getsentry/sentry-go\tv0.12.0\th1:era7g0re5iY13bHSdN/xMkyV+5zZppjRVQhZrXCaEIk=\n\tdep\tgithub.com/go-ini/ini\tv1.67.0\th1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=\n\tdep\tgithub.com/go-logr/logr\tv1.4.3\th1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\n\tdep\tgithub.com/go-logr/stdr\tv1.2.2\th1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\n\tdep\tgithub.com/go-sql-driver/mysql\tv1.9.3\th1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=\n\tdep\tgithub.com/go-viper/mapstructure/v2\tv2.5.0\th1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro=\n\tdep\tgithub.com/gobwas/glob\tv0.2.3\th1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=\n\tdep\tgithub.com/goccy/go-json\tv0.10.6\th1:p8HrPJzOakx/mn/bQtjgNjdTcN+/S6FcG2CTtQOrHVU=\n\tdep\tgithub.com/godbus/dbus/v5\tv5.2.2\th1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ=\n\tdep\tgithub.com/gogo/protobuf\tv1.3.2\th1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\n\tdep\tgithub.com/golang-collections/collections\tv0.0.0-20130729185459-604e922904d3\th1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4=\n\tdep\tgithub.com/golang/geo\tv0.0.0-20260526120156-e21b7802b0ee\th1:L0DB+dB7f2E+BvC518GbeU+WgELvWXTrbFiitwnFtuc=\n\tdep\tgithub.com/golang/glog\tv1.2.5\th1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I=\n\tdep\tgithub.com/golang/snappy\tv1.0.0\th1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=\n\tdep\tgithub.com/google/btree\tv1.1.3\th1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=\n\tdep\tgithub.com/google/flatbuffers\tv25.12.19+incompatible\th1:haMV2JRRJCe1998HeW/p0X9UaMTK6SDo0ffLn2+DbLs=\n\tdep\tgithub.com/google/go-querystring\tv1.1.0\th1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=\n\tdep\tgithub.com/google/pprof\tv0.0.0-20260302011040-a15ffb7f9dcc\th1:VBbFa1lDYWEeV5FZKUiYKYT0VxCp9twUmmaq9eb8sXw=\n\tdep\tgithub.com/google/shlex\tv0.0.0-20191202100458-e7afc7fbc510\th1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=\n\tdep\tgithub.com/google/uuid\tv1.6.0\th1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\n\tdep\tgithub.com/hamba/avro/v2\tv2.31.0\th1:wv3nmua7lCEIwWsb6vqsTS3pXktTxcKg5eoyNu0VhrU=\n\tdep\tgithub.com/hashicorp/errwrap\tv1.1.0\th1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\n\tdep\tgithub.com/hashicorp/go-immutable-radix\tv1.3.1\th1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\n\tdep\tgithub.com/hashicorp/go-msgpack\tv0.5.3\th1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\n\tdep\tgithub.com/hashicorp/go-multierror\tv1.1.1\th1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\n\tdep\tgithub.com/hashicorp/go-sockaddr\tv1.0.0\th1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=\n\tdep\tgithub.com/hashicorp/go-uuid\tv1.0.3\th1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\n\tdep\tgithub.com/hashicorp/golang-lru\tv1.0.2\th1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\n\tdep\tgithub.com/hashicorp/memberlist\tv0.3.1\n\t=>\tgithub.com/matrixorigin/memberlist\tv0.5.1-0.20230322082342-95015c95ee76\th1:MpmqMPooJ0Ea7W4ldIGbQV4D3z+sEiCu6C6aTibiwiQ=\n\t\n\tdep\tgithub.com/hayageek/threadsafe\tv1.0.1\th1:QTMJrninAaGQE7+CYdJWPzTlnhcBPwhxD5GDdvIf5oU=\n\tdep\tgithub.com/ianlancetaylor/demangle\tv0.0.0-20250417193237-f615e6bd150b\th1:ogbOPx86mIhFy764gGkqnkFC8m5PJA7sPzlk9ppLVQA=\n\tdep\tgithub.com/itchyny/gojq\tv0.12.16\th1:yLfgLxhIr/6sJNVmYfQjTIv0jGctu6/DgDoivmxTr7g=\n\tdep\tgithub.com/itchyny/timefmt-go\tv0.1.6\th1:ia3s54iciXDdzWzwaVKXZPbiXzxxnv1SPGFfM/myJ5Q=\n\tdep\tgithub.com/jackc/pgpassfile\tv1.0.0\th1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=\n\tdep\tgithub.com/jackc/pgservicefile\tv0.0.0-20221227161230-091c0ba34f0a\th1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=\n\tdep\tgithub.com/jackc/pgx/v5\tv5.5.5\th1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw=\n\tdep\tgithub.com/jackc/puddle/v2\tv2.2.1\th1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=\n\tdep\tgithub.com/jcmturner/aescts/v2\tv2.0.0\th1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8=\n\tdep\tgithub.com/jcmturner/dnsutils/v2\tv2.0.0\th1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo=\n\tdep\tgithub.com/jcmturner/gofork\tv1.7.6\th1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg=\n\tdep\tgithub.com/jcmturner/goidentity/v6\tv6.0.1\th1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o=\n\tdep\tgithub.com/jcmturner/gokrb5/v8\tv8.4.4\th1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8=\n\tdep\tgithub.com/jcmturner/rpc/v2\tv2.0.3\th1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY=\n\tdep\tgithub.com/jmespath/go-jmespath\tv0.4.0\th1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=\n\tdep\tgithub.com/jonboulle/clockwork\tv0.4.0\th1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=\n\tdep\tgithub.com/josharian/native\tv1.1.0\th1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=\n\tdep\tgithub.com/json-iterator/go\tv1.1.12\th1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\n\tdep\tgithub.com/kamstrup/intmap\tv0.5.2\th1:qnwBm1mh4XAnW9W9Ue9tZtTff8pS6+s6iKF6JRIV2Dk=\n\tdep\tgithub.com/klauspost/compress\tv1.19.0\th1:sXLILfc9jV2QYWkzFOPWStmcUVH2RHEB1JCdY2oVvCQ=\n\tdep\tgithub.com/klauspost/cpuid/v2\tv2.4.0\th1:S6Hrbc7+ywsr0r+RLapfGBHfyefhCTwEh3A0tV913Dw=\n\tdep\tgithub.com/klauspost/crc32\tv1.3.0\th1:sSmTt3gUt81RP655XGZPElI0PelVTZ6YwCRnPSupoFM=\n\tdep\tgithub.com/kr/pretty\tv0.3.1\th1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\n\tdep\tgithub.com/kr/text\tv0.2.0\th1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\n\tdep\tgithub.com/lmittmann/tint\tv1.1.3\th1:Hv4EaHWXQr+GTFnOU4VKf8UvAtZgn0VuKT+G0wFlO3I=\n\tdep\tgithub.com/lni/dragonboat/v4\tv4.0.0-20220815145555-6f622e8bcbef\n\t=>\tgithub.com/matrixorigin/dragonboat/v4\tv4.0.0-20261006150417-abc3d2fce5a6\th1:AQWG/u9fUQvn7WTGRvjV9CkHyNI8mCxpr8qZf3vRAmg=\n\t\n\tdep\tgithub.com/lni/goutils\tv1.3.1-0.20220604063047-388d67b4dbc4\n\t=>\tgithub.com/matrixorigin/goutils\tv1.3.1-0.20220604063047-388d67b4dbc4\th1:+SmZP2bG+YcO/ntzjCleCu6hFTJiue7Oj2tftpJKTlU=\n\t\n\tdep\tgithub.com/lni/vfs\tv0.2.1-0.20220616104132-8852fd867376\n\t=>\tgithub.com/matrixorigin/vfs\tv0.2.1-0.20220616104132-8852fd867376\th1:1XpEh8nPx1yFTeTFMj/aMipEiilDhQToQS8gjEU2HxM=\n\t\n\tdep\tgithub.com/matrixorigin/mysql\tv1.8.2-0.20241106110439-6ac9ee94770d\th1:27vD3JGbrFmaQtDYQT/W1jFFr0xvipdwH5R4bZPGQdE=\n\tdep\tgithub.com/matrixorigin/simdcsv\tv0.0.0-20230210060146-09b8e45209dd\th1:DvqhuH3kOpsE6vXZA5WEaRNAUUUcf44S1p5VInbjdfU=\n\tdep\tgithub.com/mattn/go-isatty\tv0.0.21\th1:xYae+lCNBP7QuW4PUnNG61ffM4hVIfm+zUzDuSzYLGs=\n\tdep\tgithub.com/mdlayher/netlink\tv1.7.2\th1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g=\n\tdep\tgithub.com/mdlayher/socket\tv0.5.1\th1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=\n\tdep\tgithub.com/miekg/dns\tv1.1.53\th1:ZBkuHr5dxHtB1caEOlZTLPo7D3L3TWckgUUs/RHfDxw=\n\tdep\tgithub.com/minio/crc64nvme\tv1.1.1\th1:8dwx/Pz49suywbO+auHCBpCtlW1OfpcLN7wYgVR6wAI=\n\tdep\tgithub.com/minio/md5-simd\tv1.1.2\th1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=\n\tdep\tgithub.com/minio/minio-go/v7\tv7.0.99\th1:2vH/byrwUkIpFQFOilvTfaUpvAX3fEFhEzO+DR3DlCE=\n\tdep\tgithub.com/mitchellh/mapstructure\tv1.5.0\th1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\n\tdep\tgithub.com/moby/sys/userns\tv0.1.0\th1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=\n\tdep\tgithub.com/modern-go/concurrent\tv0.0.0-20180306012644-bacd9c7ef1dd\th1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\n\tdep\tgithub.com/modern-go/reflect2\tv1.0.3-0.20250322232337-35a7c28c31ee\th1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8=\n\tdep\tgithub.com/mohae/deepcopy\tv0.0.0-20170929034955-c48cc78d4826\th1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=\n\tdep\tgithub.com/mozillazg/go-httpheader\tv0.2.1\th1:geV7TrjbL8KXSyvghnFm+NyTux/hxwueTSrwhe88TQQ=\n\tdep\tgithub.com/mschoch/smat\tv0.2.0\th1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM=\n\tdep\tgithub.com/munnerz/goautoneg\tv0.0.0-20191010083416-a7dc8b61c822\th1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\n\tdep\tgithub.com/ncruces/go-dns\tv1.2.5\th1:d2zZVWUassOyUOc8okB70hXBZrupqkuls7C7ZXMaKMM=\n\tdep\tgithub.com/openacid/slimarray\tv0.1.3\th1:+/+G8k+Nz4p8QUj4J2kd7IzFC5DiJzk5H2QPp/BpHHk=\n\tdep\tgithub.com/opencontainers/runtime-spec\tv1.3.0\th1:YZupQUdctfhpZy3TM39nN9Ika5CBWT5diQ8ibYCRkxg=\n\tdep\tgithub.com/opentracing/opentracing-go\tv1.2.1-0.20220228012449-10b1cf09e00b\th1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A=\n\tdep\tgithub.com/panjf2000/ants/v2\tv2.12.0\th1:u9JhESo83i/GkZnhfTNuFMMWcNt7mnV1bGJ6FT4wXH8=\n\tdep\tgithub.com/parquet-go/parquet-go\tv0.25.1\th1:l7jJwNM0xrk0cnIIptWMtnSnuxRkwq53S+Po3KG8Xgo=\n\tdep\tgithub.com/pbnjay/memory\tv0.0.0-20210728143218-7b4eea64cf58\th1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0=\n\tdep\tgithub.com/petermattis/goid\tv0.0.0-20260330135022-df67b199bc81\th1:WDsQxOJDy0N1VRAjXLpi8sCEZRSGarLWQevDxpTBRrM=\n\tdep\tgithub.com/philhofer/fwd\tv1.2.0\th1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM=\n\tdep\tgithub.com/pierrec/lz4/v4\tv4.1.27\th1:+PhzhWDrjRj89TH2sw43nE3+4+W8lSxIuQadEHZyjUk=\n\tdep\tgithub.com/pkg/errors\tv0.9.1\th1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\n\tdep\tgithub.com/pkoukk/tiktoken-go\tv0.1.6\th1:JF0TlJzhTbrI30wCvFuiw6FzP2+/bR+FIxUdgEAcUsw=\n\tdep\tgithub.com/planetscale/vtprotobuf\tv0.6.1-0.20250313105119-ba97887b0a25\th1:S1hI5JiKP7883xBzZAr1ydcxrKNSVNm7+3+JwjxZEsg=\n\tdep\tgithub.com/plar/go-adaptive-radix-tree\tv1.0.5\th1:rHR89qy/6c24TBAHullFMrJsU9hGlKmPibdBGU6/gbM=\n\tdep\tgithub.com/pmezard/go-difflib\tv1.0.1-0.20181226105442-5d4384ee4fb2\th1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\n\tdep\tgithub.com/prometheus/client_golang\tv1.23.2\th1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=\n\tdep\tgithub.com/prometheus/client_model\tv0.6.2\th1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=\n\tdep\tgithub.com/prometheus/common\tv0.67.5\th1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4=\n\tdep\tgithub.com/prometheus/procfs\tv0.20.1\th1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc=\n\tdep\tgithub.com/robfig/cron/v3\tv3.0.1\th1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=\n\tdep\tgithub.com/rogpeppe/go-internal\tv1.14.1\th1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=\n\tdep\tgithub.com/rs/xid\tv1.6.0\th1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=\n\tdep\tgithub.com/samber/lo\tv1.38.1\th1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=\n\tdep\tgithub.com/sean-/seed\tv0.0.0-20170313163322-e2103e2c3529\th1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\n\tdep\tgithub.com/segmentio/asm\tv1.1.3\th1:WM03sfUOENvvKexOLp+pCqgb/WDjsi7EK8gIsICtzhc=\n\tdep\tgithub.com/segmentio/encoding\tv0.4.0\th1:MEBYvRqiUB2nfR2criEXWqwdY6HJOUrCn5hboVOVmy8=\n\tdep\tgithub.com/shirou/gopsutil/v3\tv3.23.12\th1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4=\n\tdep\tgithub.com/sirupsen/logrus\tv1.9.4\th1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=\n\tdep\tgithub.com/spf13/cobra\tv1.10.2\th1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=\n\tdep\tgithub.com/spf13/pflag\tv1.0.10\th1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=\n\tdep\tgithub.com/spkg/bom\tv1.0.0\th1:S939THe0ukL5WcTGiGqkgtaW5JW+O6ITaIlpJXTYY64=\n\tdep\tgithub.com/stretchr/testify\tv1.11.1\th1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\n\tdep\tgithub.com/substrait-io/substrait-protobuf/go\tv0.85.0\th1:zk6MtNWLtDSl8a7qCZRFH0+EIIXVrrd/hsgYK/SQTgM=\n\tdep\tgithub.com/tencentyun/cos-go-sdk-v5\tv0.7.55\th1:9DfH3umWUd0I2jdqcUxrU1kLfUPOydULNy4T9qN5PF8=\n\tdep\tgithub.com/tetratelabs/wabin\tv0.0.0-20230304001439-f6f874872834\th1:ZF+QBjOI+tILZjBaFj3HgFonKXUcwgJ4djLb6i42S3Q=\n\tdep\tgithub.com/tetratelabs/wazero\tv1.8.1-0.20240916092830-1353ca24fef0\th1:NCRnJ+X6eZt3awiReoHCcDuC6Wf+CgWk6p4IDkIuxTo=\n\tdep\tgithub.com/ti-mo/conntrack\tv0.5.1\th1:opEwkFICnDbQc0BUXl73PHBK0h23jEIFVjXsqvF4GY0=\n\tdep\tgithub.com/ti-mo/netfilter\tv0.5.2\th1:CTjOwFuNNeZ9QPdRXt1MZFLFUf84cKtiQutNauHWd40=\n\tdep\tgithub.com/tidwall/btree\tv1.7.0\th1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI=\n\tdep\tgithub.com/tidwall/pretty\tv1.2.1\th1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\n\tdep\tgithub.com/tinylib/msgp\tv1.6.4\th1:mOwYbyYDLPj35mkA2BjjYejgJk9BuHxDdvRnb6v2ZcQ=\n\tdep\tgithub.com/tklauser/go-sysconf\tv0.3.16\th1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA=\n\tdep\tgithub.com/tklauser/numcpus\tv0.11.0\th1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw=\n\tdep\tgithub.com/tmc/langchaingo\tv0.1.13\th1:rcpMWBIi2y3B90XxfE4Ao8dhCQPVDMaNPnN5cGB1CaA=\n\tdep\tgithub.com/twmb/franz-go\tv1.21.6\th1:+v0dQJVIIuw9uPmPWmPrkoUHs1pPeV8MSwA4eU/Y2kY=\n\tdep\tgithub.com/twmb/franz-go/pkg/kadm\tv1.18.0\th1:WRf/LZmDdcDXwX7WMbtDU++v+b3NzYh2bCGoPMmzirw=\n\tdep\tgithub.com/twmb/franz-go/pkg/kmsg\tv1.13.1\th1:fG5kItwysTk5UXqVwb64EpQEy3TydF3vYYK21nUQ+bI=\n\tdep\tgithub.com/uber/h3-go/v4\tv4.5.0\th1:7ruJoHCtYOCyihXfQRsPb4o6CfkhCBtVeZFM7+z1kww=\n\tdep\tgithub.com/unum-cloud/usearch/golang\tv0.0.0-20260524141737-9fd6b0115dcd\th1:y37IxTSOZw3uSbMJ1gJse5x9Mcrzto6d6iWkb3NnZxs=\n\tdep\tgithub.com/valyala/fastrand\tv1.1.0\th1:f+5HkLW4rsgzdNoleUOB69hyT9IlD2ZQh9GyDMfb5G8=\n\tdep\tgithub.com/valyala/histogram\tv1.2.0\th1:wyYGAZZt3CpwUiIb9AU/Zbllg1llXyrtApRS815OLoQ=\n\tdep\tgithub.com/xdg-go/scram\tv1.2.0\th1:bYKF2AEwG5rqd1BumT4gAnvwU/M9nBp2pTSxeZw7Wvs=\n\tdep\tgithub.com/xdg-go/stringprep\tv1.0.4\th1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=\n\tdep\tgithub.com/xeipuuv/gojsonpointer\tv0.0.0-20190905194746-02993c407bfb\th1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=\n\tdep\tgithub.com/xeipuuv/gojsonreference\tv0.0.0-20180127040603-bd5ef7bd5415\th1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=\n\tdep\tgithub.com/xeipuuv/gojsonschema\tv1.2.0\th1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=\n\tdep\tgithub.com/yalue/onnxruntime_go\tv1.31.0\th1:1ln4YW1SFOFfGJZXe3jNOb2JUSt+l2pEneZfV8HdtFA=\n\tdep\tgithub.com/yanyiwu/gojieba\tv1.4.7\th1:2YkXELcYLTE0SJetq6xv4MjpEikWga6VpFn4jIFFQ/k=\n\tdep\tgithub.com/youmark/pkcs8\tv0.0.0-20240726163527-a2c0da244d78\th1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=\n\tdep\tgithub.com/zeebo/xxh3\tv1.1.0\th1:s7DLGDK45Dyfg7++yxI0khrfwq9661w9EN78eP/UZVs=\n\tdep\tgo.mongodb.org/mongo-driver/v2\tv2.8.0\th1:CxWDGQYY8QQwNjAl/aq2sfWakdnWZynnqJ9F4DhHbP8=\n\tdep\tgo.opentelemetry.io/auto/sdk\tv1.2.1\th1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=\n\tdep\tgo.opentelemetry.io/otel\tv1.43.0\th1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=\n\tdep\tgo.opentelemetry.io/otel/metric\tv1.43.0\th1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=\n\tdep\tgo.opentelemetry.io/otel/trace\tv1.43.0\th1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=\n\tdep\tgo.opentelemetry.io/proto/otlp\tv1.10.0\th1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g=\n\tdep\tgo.starlark.net\tv0.0.0-20250701195324-d457b4515e0e\th1:/WX+ZvcgVJxdIxVR9J3u45ds+Bl4IWPIHRSSICp0t3Q=\n\tdep\tgo.uber.org/automaxprocs\tv1.5.3\th1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=\n\tdep\tgo.uber.org/multierr\tv1.11.0\th1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\n\tdep\tgo.uber.org/ratelimit\tv0.2.0\th1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA=\n\tdep\tgo.uber.org/zap\tv1.27.1\th1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=\n\tdep\tgo.yaml.in/yaml/v2\tv2.4.4\th1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=\n\tdep\tgo.yaml.in/yaml/v3\tv3.0.4\th1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=\n\tdep\tgolang.org/x/crypto\tv0.51.0\th1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI=\n\tdep\tgolang.org/x/exp\tv0.0.0-20260410095643-746e56fc9e2f\th1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM=\n\tdep\tgolang.org/x/net\tv0.55.0\th1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=\n\tdep\tgolang.org/x/sync\tv0.22.0\th1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek=\n\tdep\tgolang.org/x/sys\tv0.47.0\th1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=\n\tdep\tgolang.org/x/text\tv0.37.0\th1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=\n\tdep\tgolang.org/x/time\tv0.15.0\th1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=\n\tdep\tgonum.org/v1/gonum\tv0.17.0\th1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=\n\tdep\tgoogle.golang.org/genproto/googleapis/rpc\tv0.0.0-20260414002931-afd174a4e478\th1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw=\n\tdep\tgoogle.golang.org/grpc\tv1.82.0\th1:vguDnZUPjE26w09A63VoxZPnvPjB5Riyc0mkXPFmAIU=\n\tdep\tgoogle.golang.org/protobuf\tv1.36.11\th1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=\n\tdep\tgopkg.in/ini.v1\tv1.67.1\th1:tVBILHy0R6e4wkYOn3XmiITt/hEVH4TFMYvAX2Ytz6k=\n\tdep\tgopkg.in/natefinch/lumberjack.v2\tv2.2.1\th1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\n\tdep\tgopkg.in/yaml.v3\tv3.0.1\th1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\n\tdep\tvitess.io/vitess\tv0.24.0\th1:1beFkQ3hbozQv0pmuicu1LL22szH7yVwZR/fofGiXxk=\n\tbuild\t-buildmode=exe\n\tbuild\t-compiler=gc\n\tbuild\t-ldflags=\"-extldflags '-L/workspace/matrixone-mv-pr/cgo -lmo -L/workspace/matrixone-mv-pr/thirdparties/install/lib -lusearch_c -lroaring -fopenmp -Wl,-rpath,/workspace/matrixone-mv-pr/cgo -Wl,-rpath,/workspace/matrixone-mv-pr/thirdparties/install/lib'\"\n\tbuild\tCGO_ENABLED=1\n\tbuild\tCGO_CFLAGS=\"-I/workspace/matrixone-mv-pr/cgo -I/workspace/matrixone-mv-pr/thirdparties/install/include\"\n\tbuild\tCGO_CPPFLAGS=\n\tbuild\tCGO_CXXFLAGS=\n\tbuild\tCGO_LDFLAGS=-L/workspace/matrixone-mv-pr/thirdparties/install/lib\n\tbuild\tGOARCH=amd64\n\tbuild\tGOOS=linux\n\tbuild\tGOAMD64=v1\n\tbuild\tvcs=git\n\tbuild\tvcs.revision=cd5de147d5043ff1795bfb430714afcc9019f144\n\tbuild\tvcs.time=2026-10-16T07:54:19Z\n\tbuild\tvcs.modified=true\n", + "source_sha256": { + "pkg/mv/task.go": "cb988957ed653d1a549d815e2b4ce37e3a59c09924ba9f45b89455930f8dd9a2", + "pkg/cnservice/server_task.go": "420d8f16e201f58a5239166dbc26306f279ee952c2bc44c453ff1803ca2e1070", + "optools/run_materialized_view_bvt.sh": "81d4b89de74430970f1a550bc15c73b58c8289a8e3d3ecde702948207341c966", + "test/materialized_view/native_probe/main.go": "2030ccc5981c5c56b636a82ce8056e902483221411dcd60377184ee7fd1d5fee", + "test/materialized_view/native_probe/check.py": "6611390c0b0572837296d2dc3d02863bcee4b9295631a58972dd25522e71d31e" + }, + "frozen_tracked_non_documentation_inputs": 11061, + "frozen_input_map_sha256": "47459bdfb7a7f5fa7be14059bb4aed569151be71a4f91f7a8bcc869a0270bceb", + "coverage": { + "package": "test/materialized_view/native_probe", + "regions": 32, + "covered_regions": 28, + "region_percent": 87.5, + "statements": 56, + "covered_statements": 50, + "scope": "component counters, not aggregate CI verdict", + "threshold_or_exclusion_changes": false + }, + "all_owned_services_reaped": true, + "matching_live_processes": [], + "new_head_ci": "pending publication" +} diff --git a/docs/design/materialized_view_ci_coverage_results.json b/docs/design/materialized_view_ci_coverage_results.json new file mode 100644 index 0000000000000..44f156da22c29 --- /dev/null +++ b/docs/design/materialized_view_ci_coverage_results.json @@ -0,0 +1,69 @@ +{ + "baseline_head": "9ffe2fb06a2e311f937a8c3cd622885438b30eb6", + "baseline_ci_run": 38489522602, + "baseline_changed_coverage": { + "covered": 386, + "total": 1040, + "percentage": 37.12 + }, + "validation_scope": "Local reproduction; GitHub checks for the correction remain independent. Reuse complete old CI profiles only for unchanged production sources. Replace stale client positions with fresh nonempty instrumentation. No CI coverage policy changes.", + "go_version": "1.27.1", + "bvt": { + "sql_statements": 54, + "failed": 0, + "ignored": 0, + "functional": 63, + "failure_rollback": 5, + "causal_two_cn": 9, + "native_entry_wall_seconds": 105, + "new_processes_started_by_bvt_entry": 0 + }, + "task_subcases": [ + "TestMaterializedViewTaskAdmission/non-async_task", + "TestMaterializedViewTaskAdmission/malformed_envelope", + "TestMaterializedViewTaskAdmission/unknown_version", + "TestMaterializedViewTaskAdmission/metadata_failure", + "TestMaterializedViewTaskAdmission/obsolete_epoch", + "TestMaterializedViewTaskAdmission/manual_policy", + "TestMaterializedViewTaskAdmission/definer_success", + "TestMaterializedViewTaskAdmission/definer_failure", + "TestMaterializedViewTaskAdmission/already_published_failure", + "TestMaterializedViewInterruptedTaskRecovery/success", + "TestMaterializedViewInterruptedTaskRecovery/scan_failure", + "TestMaterializedViewInterruptedTaskRecovery/reschedule_failure", + "TestMaterializedViewInterruptedTaskRecovery/abort_failure", + "TestMaterializedViewInterruptedTaskRecovery/cancelled_page", + "TestMaterializedViewHistoryRetention/overlapping_pages", + "TestMaterializedViewHistoryRetention/key_scan_failure", + "TestMaterializedViewHistoryRetention/count_page_failure", + "TestMaterializedViewHistoryRetention/age_page_failure", + "TestMaterializedViewHistoryRetention/delete_failure", + "TestMaterializedViewHistoryRetention/cursor_failure", + "TestMaterializedViewHistoryRetention/cancelled_page" + ], + "owning_package": "pkg/mv", + "owning_package_passed": true, + "local_coverage_summary": { + "approved": true, + "covered_blocks": 318369, + "covered_modified_lines": 793, + "has_go_changes": true, + "has_pr_coverage": true, + "minimal_coverage": 0.75, + "overall_coverage": 0.799124993411095, + "pr_coverage": 0.7603068072866731, + "schema_version": 1, + "total_blocks": 398397, + "total_modified_lines": 1043 + }, + "source_sha256": { + "pkg/mv/task_test.go": "828a2465b692f113c72ff60a42c8897355cc76161d4bf74501746a7c2f74ff1a", + "test/materialized_view/main.go": "ba31738b8e43a3b8f4d5eec3d7d6e1a7e90d8d70f621e1e772432033caaf926c", + "test/materialized_view/additional.go": "b0b978f8074fb9d82aa9bb3a81d99fc289e80b806dbf72c05d76c97ed5ffae84", + "optools/run_bvt_group.sh": "9a461777a6478a68ceba8576209f89aadc5c6b30d508b687e7fb3f620a9e68fe", + "optools/run_materialized_view_bvt.sh": "8b9a4cb4b5a7f774789fbf927eb7273c8e4edef7c3e9224cea872058dde6d775", + "test/distributed/cases/view/materialized_view.sql": "20da9b3ba716bb9a3e9391895f9f93171ee0ea9f572ca6d9a35995160fa34117", + "test/distributed/cases/view/materialized_view.result": "0f482ae6b29e9bf0a6660d7a6b6d9b9efa70989f8be4e450bef7da57ffe64573" + }, + "binary_sha256": "ba6b6f6d4a6ba779196b64cc554bce51b77cad03f2e694a65a5082b819230074" +} diff --git a/docs/design/materialized_view_ci_port_results.json b/docs/design/materialized_view_ci_port_results.json new file mode 100644 index 0000000000000..2f274ea58c442 --- /dev/null +++ b/docs/design/materialized_view_ci_port_results.json @@ -0,0 +1,76 @@ +{ + "failed_head": "07bc11c55e12d3509018333223413c76c07c2fd4", + "failed_run": 38500065915, + "failed_job": 115647614022, + "failed_step": "Start BVT Test", + "normal_proxy_sql": { + "total": 83990, + "success": 83535, + "existing_ignored": 455, + "failed": 0, + "mv_sql_passed": 54 + }, + "failure": "Native consumer initial MySQL handshake EOF: both SQL listeners were 6001, but Compose and runner exposed/queried 6002. Zero native cases ran.", + "changed_contract": "Publish and discover CN SQL target 6001 with dynamic host ports; preserve proxy host 6001/container 6009.", + "validation": { + "docker": "28.4.0", + "compose": "v2.40.3", + "topology": "Two real Docker CNs, each SQL port 6001 and proxy-enabled=true; shared TN/LOG and DISK-V2; same feature production inputs as the tested head. Local image ABI matches Debian 13 build host.", + "dsn_overrides": false, + "mysql_greeting_bytes": [ + 95, + 95 + ], + "old_target_missing_listener": true, + "corrected_target_matches_listener": true, + "functional": 63, + "native_failure": 5, + "causal_two_cn": 9, + "total": 77, + "entry_wall_seconds": 90, + "benchmark_in_bvt": false, + "added_retries_or_skips": false + }, + "report_sha256": { + "functional": "819db761cb7a69162eb5c09d918f9424c57e990309f2d443d28751c43bb079c5", + "failure": "e4800412a5ef7791a9ac82aff388484c570f7f06129fdca5fe57498d54d73d87", + "multi-cn": "74f536f20fa6599c61f5913d8b9a278be185dd0945d93f2c88f3bc20d4b95a4c" + }, + "source_sha256": { + "etc/launch-tae-compose/compose.yaml": "b201aea62b130b94663f39952897ba822683ea96c69c75503a85f7776b50954e", + "optools/run_materialized_view_bvt.sh": "438253c14d36e817c7192c42570c262f22f0eb6b3af85c9b8789e9e48f7048d6" + }, + "ci_scope": "Local proof of the corrected port boundary, not final-head GitHub CI success. Previous coverage job failed prerequisites, not its coverage threshold.", + "latest_main_validation": { + "merged_main": "fcad62a8ff06000e682824802f1155cbeea02a2f", + "upstream_change": "#29963 parenthesized ALTER TABLE ADD COLUMN", + "resolution": "Merge grammar and regenerate mysql_sql.go using the repository goyacc; retain upstream parser controls.", + "yacc_shift_reduce_conflicts": 0, + "yacc_reduce_reduce_conflicts": 0, + "owning_package_tests": { + "mysql": "pass (0.366s)", + "plan": "pass (56.890s)" + }, + "incremental_vet": "pass", + "configured_lint_issues": 0, + "sql_bvt": { + "total": 58, + "success": 58, + "failed": 0, + "ignored": 0 + }, + "sql_controls": "Parenthesized ADD rejects MV writes and dependent source schema changes; succeeds after dropping the MV and preserves source rows with NULL new columns.", + "native_checks": { + "functional": 63, + "failure": 5, + "multi-cn": 9 + }, + "report_sha256": { + "functional": "888148aa928be4627ad7fd8af16a1468b436177cbdd725e46278c1f54b4eff93", + "failure": "d6f5103f1b9ebccd354e8bad42671ed1b742e10591e718f038ed45735c5ad68a", + "multi-cn": "513ea1e5aff259c5e38bb6f0ae46dc2d9a40ba079f8d10ce5d9d2f122e02d5f4" + }, + "service_sha256": "4fbe9f283b873fb07f0d26c4051ab35ff414b161e35c43186126fd41f9a422ea", + "scope": "Fresh native service built from the merged parser and feature; two host CNs. The distinct Docker default-discovery port proof remains recorded above. Not final-head GitHub CI success." + } +} diff --git a/docs/design/materialized_view_ci_results.json b/docs/design/materialized_view_ci_results.json new file mode 100644 index 0000000000000..90340b1d28fb0 --- /dev/null +++ b/docs/design/materialized_view_ci_results.json @@ -0,0 +1,327 @@ +{ + "failed_ci": { + "run": 38345343672, + "attempt": 1, + "head": "417811f5949dc04c9bd6d74d624bce2b852506c2" + }, + "local_platform": "linux/amd64", + "go_version": "1.27.1", + "mo_tester_commit": "309a0ca650e0c55e90292767fd61e4976818d66d", + "bvt": { + "topology": "two CNs, shared TN/log, fresh task-owned cluster; isolated mo-tester invocation per file", + "flags": [ + "-n", + "-g", + "-o" + ], + "cases": [ + { + "case": "clone_sys_db_table_to_new_db_table.sql", + "total": 203, + "success": 203, + "failed": 0, + "ignored": 0, + "abnoraml": 0, + "log_sha256": "5d2962578b466b4b8ae428ee17b0f545ad9d382532e10c1008265f925e2599ae" + }, + { + "case": "create_account.sql", + "total": 150, + "success": 150, + "failed": 0, + "ignored": 0, + "abnoraml": 0, + "log_sha256": "6681274129a2f8b20a3d02b7247c154cef2023d26b513953d3547c4bb6fd7f1c" + }, + { + "case": "database_statistics.sql", + "total": 218, + "success": 196, + "failed": 0, + "ignored": 22, + "abnoraml": 0, + "log_sha256": "c2c95f3575d598c9918213a844b0169281a47eceea6527e4382c7bb59d18185d" + }, + { + "case": "mo_cloud.sql", + "total": 170, + "success": 170, + "failed": 0, + "ignored": 0, + "abnoraml": 0, + "log_sha256": "c3b5a96cd5c70dad2241ce802266e9a393291f00067951448186cf6d8a15cd9b" + }, + { + "case": "restore_cluster_fk.sql", + "total": 478, + "success": 478, + "failed": 0, + "ignored": 0, + "abnoraml": 0, + "log_sha256": "e5fd146661ad1e4f1cae3ae6354fbeb7d6311051b273e4a69eb72766941e6e77" + }, + { + "case": "restore_cluster_simple.sql", + "total": 429, + "success": 429, + "failed": 0, + "ignored": 0, + "abnoraml": 0, + "log_sha256": "347361f2438a8a1fd2e970b953ccbcd635c1f0805866b1047a77351392e90850" + }, + { + "case": "restore_cluster_table.sql", + "total": 330, + "success": 330, + "failed": 0, + "ignored": 0, + "abnoraml": 0, + "log_sha256": "b4e2327f55aa144ce5af4536f1dc91d70cac480c27b70205768b750f84df7011" + }, + { + "case": "restore_cluster_view.sql", + "total": 307, + "success": 307, + "failed": 0, + "ignored": 0, + "abnoraml": 0, + "log_sha256": "ec841395f8e3c6525367848feecb8f8e14bd7b8cf1fe5dc84edf3678f4e4daed" + }, + { + "case": "restore_dropped_account_with_cluster.sql", + "total": 204, + "success": 204, + "failed": 0, + "ignored": 0, + "abnoraml": 0, + "log_sha256": "d9f8b9567b654694dbc4ce40e8869ee8cea956455426cd305c7c2a6bb7519547" + }, + { + "case": "restore_skip_experimental_index_flag_check.sql", + "total": 83, + "success": 83, + "failed": 0, + "ignored": 0, + "abnoraml": 0, + "log_sha256": "e785a464b088d7acd58af118faf55c994a0400ddea23f99c09275e71cb29633a" + }, + { + "case": "show.test", + "total": 189, + "success": 189, + "failed": 0, + "ignored": 0, + "abnoraml": 0, + "log_sha256": "36931e827c146fd54a0f42247d7d6a096d4466e117831167113a9ede03d56c93" + }, + { + "case": "sp_table.sql", + "total": 2, + "success": 2, + "failed": 0, + "ignored": 0, + "abnoraml": 0, + "log_sha256": "bdc9848450fd53f541b651d7b0bdd93272a6323ed2327b3383279cb7db985893" + } + ], + "total": 2763, + "passed_statements": 2741, + "ignored_by_existing_cases": 22, + "failed": 0 + }, + "native_mv": { + "main_passed": 67, + "source_rows": 10000, + "two_cn_passed": 9, + "performance_classification": "diagnostic only; the earlier isolated benchmark evidence is unchanged" + }, + "owning_packages": { + "mode": [ + "-short", + "-tags matrixone_test", + "-count=1" + ], + "passed": [ + "pkg/bootstrap", + "pkg/cnservice", + "pkg/frontend", + "pkg/sql/compile", + "pkg/mv" + ], + "log_sha256": "55d2015d8041fff8f61818471145897d5120be4f1c29feba330bc0cd2e5baa44" + }, + "static": { + "license_eye": "0.4.0", + "valid_headers": 54, + "ignored_headers": 6, + "invalid_headers": 0, + "golangci_lint": "2.14.0", + "new_issues": 0, + "closure": [ + "./pkg/bootstrap", + "./pkg/bootstrap/versions/v4_0_15", + "./pkg/catalog", + "./pkg/cnservice", + "./pkg/defines", + "./pkg/frontend", + "./pkg/logservice", + "./pkg/mv", + "./pkg/pb/task", + "./pkg/sql/colexec/insert", + "./pkg/sql/colexec/multi_update", + "./pkg/sql/compile", + "./pkg/sql/parsers/dialect/mysql", + "./pkg/sql/parsers/tree", + "./pkg/sql/plan", + "./pkg/util/executor", + "./test/materialized_view" + ], + "molint_exit": 0 + }, + "source_sha256": { + "pkg/bootstrap/service_statistics_upgrade_test.go": "dfe30494572b9618328e29f805f4e15d65ac2531af1be6c9055530840420da28", + "pkg/bootstrap/upgrade.go": "80167fa58e624ba7b2b847d4e438ef5a5b94099c8a3cb52d4b7fab523d870141", + "pkg/bootstrap/versions/v4_0_15/upgrade.go": "dc88766e43126eced67701bc92833166ceccc778410e67787fa8054ea70f68cd", + "pkg/bootstrap/versions/v4_0_15/upgrade_test.go": "b74fb36a4ec91726eb1718cb48cac61d28cccb15c2041143aa233deb4853a8b2", + "pkg/catalog/materialized_view.go": "a568c44a3716ecb9cf11de62cd66245b1bc39812089bde6c0806708e6d26aab3", + "pkg/catalog/materialized_view_test.go": "43e6d2f3521710dcfe64c427a84809de339e5d20c23a4ad546284a8cbf3a6984", + "pkg/cnservice/server.go": "d7288ce0ae8c01b2a65c3856b846dd8ce70f606490b0d41b7db4e382df15a414", + "pkg/cnservice/server_task.go": "b52fef49c3bf5281f094d45ffd586948ae6a24b5cab7fc873c16af239a58843a", + "pkg/cnservice/server_task_test.go": "600368a26ea98222ee24e165daca7a4320c2ff52d239b3c40f0527dc63e0b87d", + "pkg/defines/const.go": "f73595a7d2e6b43765f24b0cc3602b5e4f14bae45005eebc7cc028ad229e4d63", + "pkg/defines/materialized_view.go": "535786df3c5e948d2f279beaefb24d1c7b0b7c92ec7077a9a00de5722743f131", + "pkg/defines/materialized_view_test.go": "dd2952ee6d5c79045e9181dabc8825c82c2034b756cedff8a2bd87f912690435", + "pkg/frontend/authenticate.go": "9f9ae9bb714d0b25b0b738dad4298c5be93e6b1f1c3c9ab5314d55dd2404edb4", + "pkg/frontend/materialized_view.go": "b23818c201006c03b91cbc3df19a5cddd6d7ddae088bec25848a1682350fef99", + "pkg/frontend/materialized_view_test.go": "693516dabc6144c7c836d83c2e330a79d8f03a0bf203fb232620ee3d02c5c657", + "pkg/frontend/mysql_cmd_executor.go": "4403758c4ff5dde96db38def86201daf97cfdc3681b48c361a98d55b806b4dba", + "pkg/frontend/pitr.go": "2519045ac3670fd0ca19640b410ef260302d47de2b1ca2086ef83550be66c337", + "pkg/frontend/self_handle.go": "b9ba6c39cc7c729278953d7b6d7fe0bf1df73e4d71a1b72bc9f734427897b5e0", + "pkg/frontend/snapshot.go": "95617900cd682cb3e8238cad0c6d88c4a2a47a1f9bafedc386337cea388e61f7", + "pkg/frontend/snapshot_catalog_restore_test.go": "b41c4354f76c0dc91fb240fe4ab6f67e4b1470aa3ad4c2edbeebe76188630df8", + "pkg/frontend/status_stmt.go": "cfe26f2a4849b7aaebf862882dd90a148d193ee888d16d3b4f741b58510f56c2", + "pkg/frontend/stmt_kind.go": "c8ca02e5e7072653b1968ef3c95cf142a98cfeece8bb20e4b3894d0e5896cd54", + "pkg/frontend/variables.go": "deb022dd1e5611947607bf317ccc27ccec6f0eb36c40d63ab0499b7e6a36f84e", + "pkg/logservice/gossip_fixture_test.go": "e03e61bbdc053ab4a316eeaaa553d865f35acc9df4d889815284b6160e717255", + "pkg/mv/service.go": "f8fd435b54c49197d6eb6dd6d315229119fb2e5debac9e6d7154bcfd17a734b9", + "pkg/mv/service_test.go": "6af5334dd74bc3e825c6451496a98307d8d675a2239d63231d0e725a013911d4", + "pkg/mv/task.go": "41d2c860c5d564318c4c750f6849159ef7834c10851fbf8345964db91255a51c", + "pkg/mv/task_test.go": "f2ccf07a8a4805cc884a860e20e8788c0c19303e8ae1f210ab682c55fa80b833", + "pkg/pb/task/task.pb.go": "8d5e61880176cd8e77e9f7ac42fa42254fe6f606930cc7d75d888d7cc8d213a6", + "pkg/sql/colexec/insert/insert.go": "b7ab1e1f3e292938ca1fd0d0d911eaf24582c56cc7f7590dcda113dc06981a01", + "pkg/sql/colexec/insert/materialized_view_test.go": "c39fd9157382b14b3ecd79c0e74f54829c12791f8aa00fd0da89d7d1092bb79a", + "pkg/sql/colexec/multi_update/materialized_view_test.go": "3b53302391b9035f48ea667672061ee31b73bd4b2157c039552d78c901ad9c9e", + "pkg/sql/colexec/multi_update/multi_update.go": "359c3b81787cd0ef48496dcb9737d4b8eca00a22b75b45213b72aa259121601d", + "pkg/sql/compile/alter.go": "1eb4f6da07d9f3848d5099e1eb6c0d0f2549b7579b680ac8ad633f939963d7ec", + "pkg/sql/compile/compile.go": "b57ebebbbe53c3ff1e924416396ce3e91835ffa406b69a5c6dc535ce5d723db4", + "pkg/sql/compile/ddl.go": "6e51550dd971db2c2dc2ac7316cf020f608d475cd702dbc9a4a1c9abbcf06d16", + "pkg/sql/compile/lifecycle_fk_scope.go": "5cc7f41a3c23511d7f4c89ef87814ffbfb8d34c8807ffc1e05c198db7b3f49f3", + "pkg/sql/compile/materialized_view.go": "cf367f04644c5c388e9f6cf080ca32ab4368a4d581292225f74bffe2149ba09b", + "pkg/sql/compile/materialized_view_test.go": "1981593b60f1a43a87ec3494a2134e94e4bff70aa7db2f1d66a17d5524d68b36", + "pkg/sql/compile/scheduler.go": "63ef97313b5fd442ff23dc53b9953dc0c5b45d482686b054e34e01feec045550", + "pkg/sql/compile/sql_executor.go": "ca2f24116dd585ceb313bfc3232aeb7c2cf8f3b6f0460a9bf4b628c43ee9c884", + "pkg/sql/parsers/dialect/mysql/keywords.go": "fdfbb26912b1f3ae3ade81e6eaf212b0a53897075b7f543876c81b8f7edd8820", + "pkg/sql/parsers/dialect/mysql/materialized_view_test.go": "4814e6378df8889a097a37f93efa00e4ee6c78a9d58ca600a9bd7b680823f708", + "pkg/sql/parsers/dialect/mysql/mysql_sql.go": "a5e23edd3b7dcfe64094e33b6db93823334bc89b6c6195c567217165eba9f77c", + "pkg/sql/parsers/tree/materialized_view.go": "017f1efce475417e61f409adcaa34b1f5b1057cc9b11d6498376b872f7a64cd7", + "pkg/sql/plan/build.go": "d5bd90fd3978c93a40300f01581bdec9e56b9b1395f911f41ac3181c3c8bca8e", + "pkg/sql/plan/build_constraint_util.go": "c28aa58d0892285bc0247160068106341beb9a9fb5af15304a6c31196bc485d0", + "pkg/sql/plan/build_ddl.go": "4d324458178634d1b8b33d92bdf4802ee0a202ee41687dc1628c9be8cb0ae306", + "pkg/sql/plan/build_dml_util.go": "9e21e4bb6226606df56a6a5061a2b5762f3d6bfe64df2a9fe5e2690a8a9825ba", + "pkg/sql/plan/build_show.go": "810f03f8e4696eec910f0b9889a0262b420744f60442729fc64e9ec773f6dc40", + "pkg/sql/plan/build_table_clone.go": "97aa426b0bc78c05b4476b276de1397cfa6baeb662225df4b7008eef23568a6c", + "pkg/sql/plan/materialized_view.go": "908996a02a54f7dd4b02a6948a590c6adb1d78ebb266f78cb41f2b4b97156f80", + "pkg/sql/plan/materialized_view_test.go": "e4b3664e697048ba1507181b8808b36cd5eebe43b4ee0ceea76a2e4036ab8b02", + "pkg/sql/plan/query_builder.go": "6eb31e57919e38bf8c9b853170e2687620cf908f93c114d04592c62359bb016c", + "pkg/util/executor/options.go": "87aa92b3b99269c4d236e752a9f0ecba7321c04d29627fd53f9debd8cc1ae856", + "pkg/util/executor/types.go": "fd02fa4802018ab672d2f5a366abf899420ae83cb86c6b402d34463d8dbed5d6", + "proto/task.proto": "d621c511f41cc2a244e6d682e63f7fd4e5148ffd13bfc52a6a28175bc61711a9", + "test/distributed/cases/dml/select/sp_table.result": "9778bcb2ad020d2fb425a317690e0402fe57158d9232c1bd85ee235a2d477665", + "test/distributed/cases/dml/show/database_statistics.result": "d7e9c46570410bb0a303e3433d210a69edcbc61707e5dc363ad897179e8b1327", + "test/distributed/cases/dml/show/show.result": "c10ded4eaea04156076fead8ac6baaf14b3c65c0ea83123a47a8774b4d07fe16", + "test/distributed/cases/git4data/clone/clone_sys_db_table_to_new_db_table.result": "7797115addd2886f2845e98cb8c1fb8066cad15ee41d88b894b1015ac9b79c4c", + "test/distributed/cases/mo_cloud/mo_cloud.result": "adeed677b463a25e8976cf67326d8877011ea0d111f16bf265a5e553edfe69c1", + "test/distributed/cases/snapshot/cluster/restore_cluster_table.result": "0329d5365c3dbdd4efeaf38f96d0702e4e72f970c87a4248a45d853f279e3fdd", + "test/distributed/cases/zz_accesscontrol/create_account.result": "b17866c7cf09605dafbbae1a2dd2ae720f6de5c42225e598e7830fc5efbb5190", + "test/materialized_view/additional.go": "77d16e6914bda7986f784482569993019fe3788d9245ad461d6b50797ccbba68", + "test/materialized_view/main.go": "1d6ffcc617d807964cb6045f9f5d95bcbae6331ad83aef645a594e7797577640", + "test/materialized_view/multi_cn.go": "236b8b3ad561db85b7890ab5ef71abc7b484670191980627d6248c8fea9ca145", + "test/materialized_view/performance.go": "3e14c1055f34f40bf7d6154e0beba5b449489fbc20140a386d422394b15ddc94", + "test/distributed/cases/snapshot/cluster_level_snapshot_restore_cluster.result": "d4ae4a1f71a20d6747770ab4ca426bc66bfa6ad3361f8e25745ce268008fa44c", + "test/distributed/cases/tenant/privilege/create_user_default_role.result": "2c3701b7ab3d60dac5f595e7d8e1b0c1a6d0c8a9d209467aff4645e7b0a1f0b6" + }, + "full_ci": "new correction-head CI must be tracked separately; local results are not full CI green", + "cron_race": { + "package": "pkg/cnservice", + "mode": [ + "-race", + "-count=20" + ], + "tests": [ + "TestLineageGCCronRegistrationDoesNotBlockCNClose", + "TestLineageGCCronRegistrationRetriesAndStops", + "TestMaterializedViewCronRegistrationOwnsRetry" + ], + "top_level_passes": 60, + "data_races": 0, + "log_sha256": "a7955d34ede5b5b014662a330711637cbba500c623934ff5b541e88b0da91001" + }, + "policy_followup": { + "failed_run": 38370142556, + "failed_head": "7b0d6f04a72a060bd6a1b739e0a9b5dbc9f7f8dd", + "step": "Static Code Analysis / make err-check", + "correction": "use moerr for missing/unsupported stored metadata; assert engine error class", + "make_err_check_exit": 0, + "catalog_suite_exit": 0, + "catalog_lint_new_issues": 0, + "evidence_reuse": "prior success-path/native/cron evidence remains unchanged; error-class behavior verified in complete catalog suite", + "full_ci": "pending follow-up head" + }, + "current_code_ci": { + "run": 38372120590, + "head": "955c3f787a1698fdf0c9a8c0ac50029d4b20b41d", + "shared_build": "success", + "arm64_sca": "success, full-repository lint: 0 issues", + "coverage_ut": "success, command exit 0; no failed package/test events", + "proxy_bvt": { + "total": 45474, + "success": 44841, + "ignored": 633, + "failed": 0 + }, + "pessimistic_bvt": { + "total": 83520, + "success": 83062, + "ignored": 455, + "failed": 3, + "cause": "four new catalog rows missing from two result fixtures" + }, + "ordinary_ut": "queued, no runner assigned; label amd64-mo-shanghai-8c16g" + }, + "fixture_followup": { + "code_changed": false, + "complete_inventory_files_audited": 8, + "cases": [ + { + "case": "cluster_level_snapshot_restore_cluster.sql", + "total": 296, + "success": 296, + "failed": 0, + "ignored": 0, + "abnoraml": 0, + "log_sha256": "95951d1689385a97cb3c595633efacca0bd1868ef5aff45be3bb16b9895e3aa8" + }, + { + "case": "create_user_default_role.sql", + "total": 127, + "success": 127, + "failed": 0, + "ignored": 0, + "abnoraml": 0, + "log_sha256": "3677900d1bae90112803289d044f2e9349be058b7577c037eb4b07c069bd2236" + } + ], + "source_behavior": "all Go/native source matches the successful current-code CI checks; only two exact result fixtures and evidence docs changed", + "full_ci": "new fixture-head CI must confirm the full pessimistic group and ordinary UT" + } +} diff --git a/docs/design/materialized_view_ci_triage.md b/docs/design/materialized_view_ci_triage.md new file mode 100644 index 0000000000000..8c346cf4a43a9 --- /dev/null +++ b/docs/design/materialized_view_ci_triage.md @@ -0,0 +1,943 @@ +# Materialized view CI integration corrections + +Tracking: [feature #30079](https://github.com/matrixorigin/matrixone/issues/30079), +[draft PR #30085](https://github.com/matrixorigin/matrixone/pull/30085). + +## Observed failures + +The reviewed run was [38345343672, attempt 1](https://github.com/matrixorigin/matrixone/actions/runs/38345343672), +checking `417811f5949dc04c9bd6d74d624bce2b852506c2`. +The reusable CI workflow was `matrixorigin/CI@b0f959479893a3ab54ff3d9422e135ae2e9c67b2`. +SCA ran on Linux/arm64; UT and the two BVT configurations ran on Linux/x86. +The Go toolchain was 1.27.1. These were concrete source, policy, and test failures, +not a reason to skip checks or retry unchanged code. + +| Failure | Root cause and correction | +| --- | --- | +| SCA, Static Code Analysis | 18 new Go files used abbreviated Apache headers. Replace them with the complete repository header. | +| UT and coverage UT, bootstrap | The expected migration chain jumped from 4.0.13 to the new final version, omitting the existing 4.0.14 tenant migration. Include that hop and test both 4.0.14 and current 4.0.15 inputs. | +| UT and coverage UT, CN service | MV cron creation was coupled to lineage GC registration. A successful lineage retry still failed the MV-specific call. Register each task independently through the same bounded, stopper-owned retry mechanism; preserve cancellation and readiness checks. | +| UT and coverage UT, logservice build | The gossip fixture called the old port allocator signature. Resolve the OS-specific range outside ephemeral client ports and pass both bounds to the allocator. | +| Frontend UT and account/cluster restore BVT | The four global MV catalogs had no restore policy. Generic restore could recreate their schemas, and cluster-table cleanup could delete them even after bulk copy was skipped. Register skip policies and apply the common policy in destructive cluster cleanup. Preserve the existing view-metadata clear/rebuild behavior and ordinary user cluster-table deletion. | +| Git4Data, COPY ALTER, database DROP, DROP INDEX, cluster restore UT | A new account-wide MV write happened before native pessimistic lifecycle admission. Its retained locks changed wait policy and serialized unrelated operations. Pessimistic creation now pins all source and target names in the existing admission domain; source DDL checks dependencies after its native locks and snapshot are ready. Optimistic SI retains its commit-time write/write fence. | +| Both BVT groups, catalog inventories | Four new visible cluster catalogs changed exact table listings. Update seven result fixtures, including clone, tenant, and cluster-restore inventories; preserve complete row comparison. | +| Coverage aggregation | The job failed its UT/BVT prerequisites. It has no independent product fix; it must rerun after those checks pass. | + +The proxy group reported 18 failed statements. The pessimistic group reported +153 failed statements, mostly cascading from catalog loss during restore. +Counts of failed statements are not counts of independent bugs. + +## Admission and restore invariants + +Pessimistic MV publication and source DDL share the same database/table-name +locks. RC creation includes every source in `createNameDomain`, checks that a +replanned domain has not expanded, and uses the existing applied-snapshot +frontier. Pessimistic SI pins the sorted source/target name set. These locks are +held through catalog publication; source DDL reads dependency rows after native +admission. Ordinary pessimistic DDL adds no MV catalog writes or account-wide +locks. Optimistic SI cannot borrow pessimistic name locks and continues to use +the durable account revision conflict, as does MV count admission. + +Snapshot/PITR cleanup must preserve the current schema and lifetime of +subsystem-owned cluster catalogs. MV objects remain unsupported for logical +restore; preserving empty global catalogs does not enable restoring MV data or +identity-qualified definitions. User-created cluster tables still follow the +normal destructive restore path, and ordinary view metadata is still cleared +for reconstruction. + +## Verification + +The correction was checked with the repository CGo wrapper and Go 1.27.1. +Focused tests used CI's `-short -tags matrixone_test` and coverage instrumentation +(`-covermode=set`); this is focused reproduction, not the complete CI +`-coverpkg` graph. The five owning suites (bootstrap, CN service, frontend, +compile, MV) passed in normal short-test mode with those same tags. + +New typed oracles cover source-domain completeness and replan changes, +pessimistic dependency rejection without account-fence writes, independent MV +cron retry, and cluster cleanup preserving all four MV catalogs while clearing +view metadata and dropping a user cluster table. + +Native embedded-cluster reproductions passed for the CI failures in +`TestIssue26121DatabaseOperationsKeepOrdinaryInternalLookingTables`, +`TestIssue26404MixedDataBranchLifecycleDoesNotDeadlock`, +`TestIssue29400CopyAlterRetainedGatePromotionFastFails`, +`TestIssue29400DropDatabaseDoesNotHoldBranchDAGAfterTable`, +`TestDropIndexAdmissionDoesNotHoldNamesWhileWaiting`, +`TestDataBranchDiffAsFile`, and +`TestIssue26640ClusterRestoreRebindsSubscriptionPrivileges`. +The account-restore reproduction was rerun after the cluster-cleanup fix. + +The two existing lineage cancellation/retry tests and the new MV cron retry +test each passed 20 race-enabled repetitions: 60 top-level passes, no data races. + +License-eye 0.4.0 checked 60 changed files: 54 valid, six ignored, zero invalid. +Configured golangci-lint 2.14.0 reported zero new issues in the 17-package closure; +the configured molint command exited successfully. These local checks run on +Linux/amd64 and do not replace CI's arm64 SCA. + +The rebuilt native service and CI's exact mo-tester revision +`309a0ca650e0c55e90292767fd61e4976818d66d` are used for targeted BVT verification. +All 12 originally failing BVT files passed as isolated invocations: 2,741 +executed statements, 22 existing ignored statements, zero failures or abnormal +results. Resource paths use the repository's `test/distributed/resources`. +The main MV harness passed 67 native checks (including scheduled refresh) on +10,000 source rows; the second-CN harness passed nine checks. See +[the machine-readable correction results](materialized_view_ci_results.json) +for per-case counts, source fingerprints, and evidence modes. + +Fresh full CI results must be checked at the correction commit. A local pass, +skipped job, or queued check is not a full CI pass. This correction makes no new +performance claim and does not relabel the earlier benchmark evidence. + + +## Follow-up SCA policy gate + +[Run 38370142556](https://github.com/matrixorigin/matrixone/actions/runs/38370142556) +checked `7b0d6f04a72a060bd6a1b739e0a9b5dbc9f7f8dd`. Its complete header check +passed (6,097 valid files, zero invalid), then `make err-check` rejected the two +`fmt.Errorf` calls in the MV metadata decoder before lint could run. This policy +is separate from golangci-lint. Missing/unsupported persisted definitions now +return `moerr.NewInternalErrorNoCtx`, matching the other catalog decoders; the +existing invalid-definition test asserts the engine error class. Valid metadata +and its admission, refresh, and restore paths are unchanged. + +The follow-up passed `make err-check`, the complete catalog suite, and configured +catalog lint. Earlier native BVT, race, and owning-package results are reused +only for their unchanged successful-metadata and lifecycle behavior. Full CI +must still be assessed at the follow-up head. + + +## Full-group result inventory follow-up + +At `955c3f787a`, shared build, complete arm64 SCA (zero lint issues), and the +complete coverage UT passed. The readable UT producer report records exit 0 +and no failed package/test event. PROXY BVT passed all 44,841 executed statements +(633 existing ignored statements). Pessimistic BVT reported only three failures +among 83,520 statements: two `show tables` results in +`snapshot/cluster_level_snapshot_restore_cluster.result` and one in +`tenant/privilege/create_user_default_role.result`, each missing the four new +catalog rows. The earlier runtime/restore/admission failures did not recur. + +Both complete inventories now include the four visible cluster catalogs. +A repository-wide search audited all eight complete inventory result files; +all include the new rows. Both newly identified files passed isolated native +mo-tester execution with their complete statement sets. This follow-up changes +only result fixtures and evidence documentation. Code-level SCA, coverage UT, +PROXY BVT, and local lifecycle/race evidence remain valid for unchanged source; +the new full-group CI status must be tracked separately. Ordinary UT was still +queued for an `amd64-mo-shanghai-8c16g` runner when this evidence was captured. + + +## Main merge conflict resolution (2026-10-13) + +Merge inputs are feature head `a321a75afce2ebc4cdd875c345ece7aef32cc038` and +main `35c8dd5854750ef96f52f9dd298a70acd031d5e4`. The generated MySQL parser +conflicted with the new JSON EXPLAIN grammar. It was regenerated from the merged +`mysql_sql.y`, without yacc conflicts, preserving both MV and JSON EXPLAIN syntax. +The gossip fixture uses main's once-per-cohort `testPortRange` admission and its +new listener-range test; the redundant inner range lookup was removed. + +The integration also exposed a main-side build failure: JSON EXPLAIN still used +`Node_VECTOR_INDEX_SCAN`, `VectorIndexScan` and removed scan fields. An isolated +worktree at the exact main SHA reproduced the same four production compiler +errors with unchanged tracked source and matching native libraries. The renderer +and its tests now use the current `IndexSearchScan` protocol, existing plugin +explain hooks, named algorithm expressions, and lossless opaque options. Existing +vector payload, literal, settings, range and malformed-expression oracles remain; +new cases cover missing metadata, unpaired/empty expression names, malformed +plugin options, fulltext, and binary options from an unregistered plugin. + +Review scope is the merge resolution and interacting source closures. Grammar +and generated output are R2; the test port fixture is R1; the read-only renderer +and its plan/frontend consumers are R2. MV creation dispatch, scan/write guards +and single-CN refresh routing were checked against the merged main side. No +MV persistence, refresh state, lock ordering, task ownership, or native dependency +changed, so previous concurrency and restart evidence remains applicable to those +unchanged contracts. Original performance measurements keep their recorded SHA. + +Linux/amd64, Go 1.27.1, the repository CGo wrapper, `-mod=readonly -p=1 +-count=1 -short -tags matrixone_test`: the complete parser, plan, JSON EXPLAIN, +frontend, compile and function suites passed, as did all 11 focused gossip fixture +tests. Initial network-restricted runs could not bind local test sockets; the +network-enabled final runs passed without skips or product workarounds. The +Makefile error-constructor check passed. Full GitHub CI at the new merge head must +be reported independently; these local results do not claim full CI completion. + +Configured golangci-lint (including govet) passed the seven-package integration +closure with zero new issues; standalone `go vet` passed the same closure. +`go vet -vettool=molint` exited 0 for the renderer and reported two advisory +recover diagnostics in unchanged main-side serialization helpers. Their bodies +match main exactly: vector cleanup is deferred, and malformed serialization is +converted into an error. No diagnostic was suppressed or cleanup removed. + + +## Remaining CI correction and integration (2026-10-14) + +At `cb53485ffe`, run 38383781049 passed shared build, arm64 SCA, Pessimistic +BVT and Connector/J E2E. PROXY BVT had exactly three failing assertions in +`optimizer/explain_format_json.sql` (83,197 successful statements, three failed, +455 ignored). They still expected the original payload/probe labels after the +first renderer migration. Ordinary UT failed source checkout with a TLS handshake +termination; coverage UT timed out at checkout after five minutes. Neither UT +job reached test execution. Coverage aggregation and CI Required failed their +prerequisites. Product failures and source-fetch failures are separate. + +The correction merges main `bcd4cb99e7fa3f8fa750e773d5409a7bb803b0bf`, adopting +#30111's complete index-search renderer, detailed plugin hooks and expanded BVT. +Existing additional metadata/fulltext/opaque-option oracles remain. Main owns +protocol 112 for WEEK/DAYOFYEAR; MV planner authoring, frontend admission, compile +registration/read admission, catalog upgrade and latest protocol now use 113. +Typed tests reject 112 before catalog access, accept private scans at 113, reject +an authoring floor of 112, and preserve ordinary scans at 112. + +A clean-source main worktree reproduced four NULLIF rebind failures in the +merged #30095 fixtures. The main binder consumes unsupported assignments and +continues collecting later valid NULLIF rules; the fixtures still expected the +older prefix-only behavior. They now assert the complete maps on all 20 rebinds, +assert every expression was consumed, and exercise JSON round trips for those +previously excluded cases. Production NULLIF behavior is unchanged. + +The nested UNION allocation-owner test also encountered the host's automatic +spill-disk margin: less than 16 GiB free storage allowed only the previous +fixture's 128-byte explicit floor. The ownership test now uses the existing +private-ledger testing API with its original 1 MiB query limit and a bounded +4 MiB aggregate. Result and terminal allocation assertions remain; cleanup also +checks memory, disk and FD reservations before closing the generation and ledger. +No production quota or resource policy was changed. This test, the existing +128-byte spill-budget test and the five-case compile protocol test each passed +ten repeats, followed by the complete compile suite. + +Topology diagnosis found that default Push mode allows an independently connected +CN to read an older applied snapshot. An immediate cross-connection read could +therefore still observe an unpopulated/previous view. The topology harness now +uses MO's existing bounded `SYNCCOMMIT` handoff after DDL, source commits and MV +publication. Latest complete values, stable identity, monotonic source coverage, +at least one concurrent success and terminal history assertions are preserved. +The unpopulated check now requires the exact error class and `MV_NOT_POPULATED` +marker. No sleep or query retry is used. These checks prove atomic publication +after a causal handoff, not stronger freshness than MO's configured read mode. + +Final Linux/amd64 local verification: eight owning suites passed with Go 1.27.1, +repository CGo wrapper, `-mod=readonly -p=1 -count=1 -short -tags matrixone_test`. +Configured lint and vet passed the eight-package integration closure; the final +compile/frontend changes and test harness passed their refreshed checks. The +error-constructor policy passed. The final rebuilt service passed all 137 +statements in the complete JSON EXPLAIN, external NULLIF and LOAD-variable +scripts, with zero failed/ignored/abnormal statements. The native MV suite passed +67 checks; 20 independent causal two-CN scenarios passed all 180 checks. Original +one-million-row performance observations keep their historical SHA; the current +10,000-row run is diagnostic evidence. New full CI must be evaluated at the +pushed correction head. + +The follow-up main merge at `f02952f7bf9c3294d5cb7876a07888d2380d48a9` is clean. +Both complete compile and plan suites pass again. Its delta affects ordinary +view replacement admission and primary-key ODKU binding/partition locking; +MV-only admission remains aligned and protocol 112 remains main's latest. +The native MV/JSON/NULLIF fixtures contain no ODKU or ordinary-view replacement, +so their relevant execution branches are unchanged and their evidence is reused. +Configured compile/plan lint is refreshed for this integration. Full CI remains +separate and must be read at the final pushed head. +### Required coverage producer integration (2026-10-14) + +At head `9ffe2fb06a2e311f937a8c3cd622885438b30eb6`, run `38489522602` +passed the shared build, arm64 SCA, coverage UT, and both full BVT deployments. +Ordinary UT was still running when the coverage verdict arrived. Coverage job +`115630262739` failed its actual changed-code gate: 386/1040 instrumented blocks +(37.12%), below the required strict >75%; the complete profile was valid. +The report exposed two missing consumers: default-off native MV SQL had no +distributed case, and the manually executed Go validation program was never +executed as a coverage producer in CI. This is a test-integration failure, not +an infrastructure failure or a reason to lower/exclude coverage. + +The correction adds the independently runnable `view/materialized_view.sql` +case and runs the existing native contract oracles after group 0's mo-tester +work. No account/cluster restore fixture can overlap the native suite. Reuse +the existing two Compose CNs through their directly published ports, rather +than relying on proxy connection placement to prove distinct CN execution. +Build the pure Go client with coverage and share the existing producer's +coverage directory. Existing trusted CI workflows already convert that +directory and enforce the same threshold; their policy remains unchanged. + +Validation map: SQL result/error goldens prove manual/deferred/DDL behavior; +the small functional mode proves typed NULL/numeric results, source grants and +revocation, authoring context, tenant isolation and scheduled refresh; the +independent failure mode proves last-good rows and FAILED history after native +overflow; the existing four-row cross-CN mode proves complete publication, +identity/provenance and terminal history after explicit causal handoffs. +Performance samples and actual process restart remain separate manual modes. +Only the minimum 60-second scheduled period uses elapsed time, with observable +result equality and a 120-second deadline. Client compilation reuses the CI Go +toolchain/cache and does not need native dependencies or new server processes. + +The coverage report then identified missing component cases for interrupted +attempt recovery and terminal-history retention. Add 21 named task subcases: +9 envelope/policy/definer cases, 5 interrupted recovery cases, and 7 retention +cases. They use existing in-memory catalog fixtures, one metadata row and one +overlapping terminal run; assert cancellation/error propagation, epoch/run +fences, no execution for obsolete/manual policies, sanitized failure history, +conditional deletion excluding RUNNING attempts, deduplication across retention +pages, and no maintenance cursor advancement after failure. No clock or service +process is added to UT. + +Local verification: all 54 SQL BVT statements passed with zero ignored/failed; +the final instrumented two-CN contract entry passed 77 checks (63 functional, +5 native rollback, 9 causal topology) in 105 seconds including client build. +Complete `pkg/mv` owning UT passed with 21 new named subcases. Using the unchanged +CI parser and strict >75% gate, the prior complete CI producer profiles for +unchanged source plus fresh local server/client and owning-UT profiles produce +793/1043 changed blocks (76.03%). This is a local coverage reproduction, not a +new GitHub CI result. Old client blocks were removed from the diagnostic merge +because source line positions changed; the fresh full client profile supplies +their replacement. Nothing is excluded from the actual CI coverage policy. + +The ordinary UT and Connector/J jobs of run `38489522602` also completed +successfully. Its CI Required gate failed only for the actual coverage verdict. +The first partial local coverage build omitted the entry package and emitted no +profile; that empty attempt is not evidence. The corrected build includes the +service entry and emits nonempty metadata/counters on graceful shutdown. The +automated CI build already instruments its entry through its normal `-cover` +build. Match the client's `set` coverage mode to that existing server build. + +### Published CN SQL port (2026-10-14) + +Run `38500065915`, head `07bc11c55e`, passed the shared build, arm64 SCA, +coverage UT, Connector/J and full pessimistic BVT. PROXY's existing mo-tester +selection also passed: 83990 statements, 83535 successful, 455 existing ignored, +zero failures, including all 54 new MV SQL statements. Its subsequent native +consumer failed before its first case with `packets.go:58 unexpected EOF` and +`invalid connection`. Coverage merge then correctly rejected its prerequisite; +this run did not produce an independent coverage threshold verdict. + +The CN TOMLs and runtime log both show SQL listening on container port 6001. +Compose instead published container port 6002, and the new native runner queried +that incorrect target. CI's docker listing showed `32772->6002` and `32773->6002` +while the native report contained zero passed cases. The normal proxy route used +port 6009 inside its own container, so its success did not validate CN publication. + +Publish each CN's actual port 6001 with a dynamically allocated host port and +query that same target in the native runner. Keep the proxy's `6001:6009` mapping. +No database, authentication, fixture assertions, timeout, retry, or coverage policy +changes are needed. + +Validation checks both old and corrected Compose JSON against the existing CN +TOMLs: the old targets omit the listener and corrected targets include it. An +isolated real Docker deployment uses two independently published CNs, both with +`proxy-enabled=true` and SQL port 6001, sharing TN/LOG and DISK-V2 storage. The +runner uses its default Docker port discovery, with no DSN override. Both mapped +ports return real MySQL greetings; all 77 contract checks pass (63 functional, +5 rollback, 9 causal cross-CN) in 90 seconds including client build. The local +image matches the Debian 13 native binary ABI; this environment adaptation is +not a CI image or product change. Task-owned containers are stopped/removed after +verification. Evidence is in `materialized_view_ci_port_results.json`. New-head +CI remains independent of this local port-boundary proof. + +Latest-main parser conflict resolution (2026-10-14): main +`fcad62a8ff06000e682824802f1155cbeea02a2f` adds parenthesized +`ALTER TABLE ADD COLUMN (...)` (#29963). The grammar merges cleanly; regenerate +`mysql_sql.go` with the repository goyacc instead of choosing either generated +file. Generation reports zero shift/reduce and zero reduce/reduce conflicts. +Retain upstream parser tests. Complete mysql parser and planner UT pass +(0.366 and 56.890 seconds), incremental vet passes, configured lint reports zero +issues. A freshly rebuilt native service passes 58/58 SQL statements with zero +ignored, failed or abnormal cases, plus all 77 native checks (63 functional, +5 rollback, 9 causal two-CN). New SQL controls reject parenthesized ADD on the +MV and its dependent source, then allow ordinary ADD after dropping the MV and +verify original rows plus NULL new columns. Port-boundary Docker proof above is +separate. This resolves the local generated-parser conflict; final-head GitHub +checks remain independent. Evidence is in `materialized_view_ci_port_results.json`. + +### Account/catalog review closure (2026-10-14) + +Reviewed head `15ef9e056fc4` passed CI, but source review exposed missing catalog +readiness, live tenant status and account-retirement integration. Revision 3 +selects ordinary DROP DATABASE RESTRICT and transactional DROP ACCOUNT retirement. +The correction also synchronizes InternalExecutor's session account identity. + +All 58 SQL statements and 84 native checks pass (70 functional, 5 failure, +9 two-CN); owning packages, incremental vet and configured lint pass. Isolated +4.0.14 kernel controls reproduce the pre-fix missing dependency table and pass +six DDL operations in each transaction mode afterward. Only that separate fixture +bypasses the earlier tenant-version login fence; main account/ACL tests authenticate +normally. Completed-task GC is an explicit terminal scheduler oracle. Full scope, +accessor-only native evidence reuse and release/re-review limits are recorded in +materialized_view_self_review.md and materialized_view_review_lifecycle_results.json. +New-head CI remains independently required; no local coverage percentage is claimed. + + +### 2026-10-15: empty account retirement and protocol collision + +Exact failed head: `e55a8a6baa9eac0e45e60f38b10ea5aad1660803`, ALL CI run +`38582531165`. Ordinary UT job `115915980970`, coverage UT job +`115916066201`, Proxy BVT job `115920997966`, and pessimistic BVT job +`115920997947` failed. SCA and shared build passed. Coverage aggregation failed +its producer prerequisite; it did not evaluate the changed-line threshold. + +The first BVT failures are ordinary `DROP ACCOUNT` statements reporting +`invalid materialized view retirement result`: Proxy at +`ddl/alter_publish_subscribe_table.sql:78`, pessimistic at +`analyze/analyze_tenant_domain.sql:45`. Ordinary UT diagnostics show the same +error in tenant-catalog, account-lifecycle, restore and published-view cleanup. +Coverage diagnostics show it in CDC and branch-account cleanup as well. Later +BVT account-exists, metadata mismatch and unavailable-connection results are +retained as failures; this patch does not claim every downstream result has been +independently reproduced or that the old run passed. + +Invariant: an installed MV catalog with zero definitions is a valid account +retirement state. The background SELECT can return either no result set or one +zero-row result set. Both must reach queued-task and metadata cleanup in the +caller-owned transaction. The helper previously rejected the first form. +The fix normalizes only the row count; multiple result sets, the 128-object +bound, exact native-table capabilities, SQL errors and rollback behavior retain +their checks. Existing readiness/failure-injection tests now exercise both empty +forms. No retries, ignored failures or coverage-policy changes are introduced. + +Merge main `f49bc6fa53` and preserve its DECIMAL statistical-result protocol +113. Move MV authoring, reading, catalog-upgrade admission and typed tests to +114, including rejecting the immediately preceding protocol/floor 113. Regenerate +the MySQL parser from the merged grammar rather than accepting a textual merge +of generated parse tables. + +Change map: retirement helper/test is R2 (public account deletion, same transaction +and cleanup owner); protocol consumers/tests are R3 compatibility (only MV +admission moves; main's DECIMAL gate stays 113); parser output is generated from +the merged grammar; this record is R0. This is a focused regression/conflict fix, +not a new feature-design revision. The existing RFC revision 3 approval remains +pending and is not self-approved by this change. + +Local validation of the merged source (Go 1.27.1, linux/amd64, repository CGo +wrapper, `matrixone_test`, `-short`, `-count=1`): + +- Full frontend package: PASS, 26.501 s. +- Full compile package: PASS, 9.396 s. +- Materialized-view focused tests in frontend, compile, plan, and v4_0_15: + PASS in all four packages, including 113/114 admission boundaries. +- Full MySQL dialect parser package after regeneration: PASS, 0.170 s. +- Existing real-client `TestIssue26114CrossAccountBranchQuotaAndOwnership`: + PASS, 9.009 s, including the previously failing account cleanup. +- `go vet` on frontend, compile, plan, v4_0_15, defines and MySQL parser: PASS. + +Evidence logs are retained under `/workspace/mv-ci/empty-retirement-*`. +These local checks do not establish the new GitHub CI result. The full BVT and +changed-line coverage result must come from the new exact-head workflow. + +Configured golangci-lint 2.14.0 over the same six-package closure, reporting only +findings since verified upstream main: PASS, `0 issues`. Final regression-scope +self-review found no additional code blockers: both empty representations reach +the existing cleanup; catalog migration, query errors, native-table capability, +transaction rollback and object bounds remain enforced. Existing RFC approval +and the new remote CI run remain separate pending delivery gates. + + +### 2026-10-15: transaction-mode-independent SHOW CREATE fixture and native DROP + +Run `38665103998`, exact head `1ec43a9800906d6f22f6932f35eb4e9e25a371f9`: +ordinary UT, coverage UT, SCA, shared build and Proxy BVT passed. Pessimistic +BVT job `116197952536` failed exactly three SQL assertions (84,357 statements, +83,899 successes, 3 failures, 455 existing ignores, 0 abnormal). All three are +`SHOW CREATE MATERIALIZED VIEW` in `view/materialized_view.sql`: the stored +GROUP BY is `k`, while the expected text has `facts.k`. Coverage aggregation +failed its BVT-producer prerequisite and did not evaluate its threshold. + +The formatter persists the bound SELECT; qualification introduced during binding +can differ with the transaction/optimizer path. Qualification equivalence is not +a separate MV result contract. The fixture now explicitly supplies `facts.k` in +both CREATE statements. The three exact SHOW CREATE result assertions, all data +and error assertions, and the 58-statement count remain unchanged; the result +file only updates the two echoed CREATE inputs. Unqualified grouping remains +covered by the native consumer's aggregate/join/tenant cases, and the failing +baseline itself passed all data/publication assertions with unqualified `k`. +No alternate accepted output, ignore marker, retry or threshold change is used. + +Cross-mode validation also found an actual DROP ownership bug: with an optimistic +deployment default, `handleDropMaterializedView` opens an optimistic internal +transaction and native DROP TABLE rejects it with `data branch lineage lifecycle +writer requires a pessimistic transaction`. The enclosing frontend transaction +cannot select the mode of this independent executor transaction. The fix selects +pessimistic/RC at the owning `ExecTxn`, matching normal native DROP admission in +`frontend/txn.go`. The nested native DROP still borrows the same transaction and +exact account/table/transaction capability; privileges, definition cleanup, +rollback, wait-for-commit behavior and refresh transaction mode remain unchanged. + +Validation uses one local CN with the existing LOG/TN configuration, normal +frontend authentication, three source rows and the actual mo-tester consumer. +The test-owned service is stopped in a finally block after each run. Switching +CN defaults changes only `[cn.txn].mode`; no fixture data or expected output is +changed between the final two modes. + +- Unfixed pessimistic baseline: 55/58 PASS, the same 3 SHOW CREATE failures as CI. +- Qualified-input fixture, before DROP fix: pessimistic 58/58 PASS; optimistic + 51/58 PASS, exposing native DROP failure and six downstream failures. This + failed run is retained as diagnosis, not claimed as validation success. +- Final fixture plus native DROP ownership fix: optimistic **58/58 PASS**, + pessimistic **58/58 PASS**, both 0 failures/ignores/abnormal. +- Full frontend owning package: PASS, 25.077 s (Go 1.27.1, repository CGo wrapper, + `matrixone_test`, `-short`, `-count=1`). + +Logs: `/workspace/mv-ci/showcreate-{before,after-pessimistic,after-optimistic, +fixed-optimistic,fixed-pessimistic}.log` and `showcreate-frontend-ut.log`. +The local cluster binary uses the unchanged 1ec43a98 kernel plus the explicit +DROP transaction-mode selection. No new cluster fixture or test data is added +to CI; the existing SQL contract is reused for both public-path regressions. + +Review map: SQL fixture/result is R1 test determinism; DROP transaction ownership +is R3 catalog lifecycle, using the existing native protocol rather than a new +lock or retry mechanism; this record is R0. The public cross-mode test supplies +the discriminating failure and success oracles; no options-only mock test is +added. The existing TxnExecutor callback retains sole commit/rollback ownership, +and no new asynchronous state, wait dependency or retained resource is added. +This is a focused regression fix; RFC revision 3 remains pending external review. + +Final static checks: gofmt/diff whitespace checks PASS; frontend `go vet` PASS; +configured golangci-lint 2.14.0 on frontend reports **0 issues**. Final-scope +self-review found no additional code blockers. New exact-head CI remains required; +passes from 1ec43a98 are reused only for unchanged semantic inputs. + + +### 2026-10-15: merge upstream POINT/CHAR/index grammar without losing MV syntax + +Previous head `c0bab97f8cae9ecd0bb4611b9490e1eb3d94b1b2` completed ALL CI +`38672006638` successfully after the failed-checkout rerun: ordinary UT, SCA, +coverage UT, both BVT groups, coverage and CI Required passed. Its strict +changed-line coverage was 894/1190 (75.13%). That is evidence for the old head, +not a claim about the new merge commit. + +Merge verified main `f2093ae4b3cf019802091f6309e31c9524829b70` (six commits +since f49bc6fa53). The only textual conflict is generated `mysql_sql.go`. +The grammar source merges cleanly: preserve upstream POINT function syntax, +CHAR CHARACTER SET casts and index USING suffix/options, together with all MV +productions/tokens. Regenerate the complete parse tables from that source using +the repository Makefile. Generation reports zero conflicts. A second generation +produces the identical blob, proving that the delivered parser is reproducible. + +Validation on merged source, Go 1.27.1, linux/amd64, `-count=1`: + +- Full parser API package: PASS, 0.103 s. +- Full MySQL dialect package: PASS, 0.225 s; includes MV syntax plus upstream + POINT, CHAR charset round trips and index suffix/identifier controls. +- Full parser tree package: PASS, 0.054 s. +- Planner `TestMaterializedView|Test.*Charset`: PASS, 0.179 s, using the repository + CGo wrapper with `matrixone_test` and `-short`; selection is nonempty. +- MySQL dialect vet: PASS. Configured incremental golangci-lint 2.14.0: 0 issues. +- Diff whitespace and unresolved-entry checks: PASS. + +Logs: `/workspace/mv-ci/parser-merge-f209-{generate,repeat,owning,plan,vet,lint}.log`. +Self-review closure: grammar composition is R2 (two public syntax consumers), +generated output and this record are R0. No handwritten parse-table selection, +new SQL feature or MV lifecycle/protocol change is introduced by the conflict +resolution. Upstream native cache/error/JSON fixes are merged unchanged. The +owning parser suites and typed planner consumer tests cover the overlap; broader +old-head CI is retained only within its semantic scope. No extra fixtures, +retries, skips or thresholds are added. No new code blockers were found in this +merge scope; external RFC/design review remains pending separately. + + +### 2026-10-15: FK publication waiter owns cancellation, not coordination timing + +Exact failed head: `02ce42dc57df449b4333c0f9470a70677d53f760`, ALL CI +`38713744052`, ordinary UT job `116353860779`. SCA, shared build, coverage UT, +both BVT groups and coverage aggregation passed. The sole failed test event is +`TestIssue29400CopyAlterRetainedGatePromotionFastFails/fk_publication/forward_true`, +with `context deadline exceeded` at the existing successful-CREATE assertion. + +The FK CREATE intentionally queues behind a retained lifecycle lock while the +test goroutine checks both catalogs and commits the holder. Its separate +15-second child deadline starts before holder setup/connection/session work. +CI shows WAL append/commit delays of 6.4 seconds and multiple delayed Raft ticks; +the CREATE is canceled at 11:15:33.44 UTC, before the holder commit completes at +11:15:34.60 UTC. Cancellation therefore defeats the very release the positive +publication case is waiting for. This evidence establishes a competing test +budget, not a demonstrated native lock-release failure or a clean-baseline +attribution of a pre-existing CI failure. + +Use a cancellable child of the existing two-minute test context for this waiter. +The outer bound is unchanged. Cancellation, holder rollback, connection close +and waiter joining retain their existing lexical owners. The queued barrier, +zero table/FK catalog counts before release, successful CREATE after commit, +current parent generation and invalid-reference rejection assertions all remain. +No sleeps, retries, skips, weaker result acceptance or larger outer timeout are +introduced. Fast-fail/deadlock error-class cases are unchanged. + +Also merge verified main `e8b3ed7f21c2b1966d74814adaa2bcd96d8c129f` to resolve +the current protocol-number conflict. Preserve main's native Unicode UNIQUE +protocol 114; move all MV authoring/read/registration and catalog-upgrade gates +to 115. Typed tests reject protocol/floor 114 and accept 115, while ordinary +scans retain their prior admission. The automatic planner merges retain both +upstream Unicode/fulltext/locking-read changes and MV hooks; no generated +parser or protobuf change is required. + +Review map: the waiter cancellation fixture is R1 with a concurrency timing +trigger; the MV protocol allocation is R3 compatibility; this evidence is R0. +The parent deadline remains the liveness bound, and exact output/error/catalog +state remain the oracles. No new process fixture, data, hook or production wait +mechanism is added. Fresh exact-root normal/race validation and focused protocol +consumer checks are recorded below; full new-head CI remains separate. + + +Validation of the merged/fixed source (Go 1.27.1, linux/amd64, repository CGo +wrapper, `matrixone_test`, `-short`, `-count=1`): + +- Exact failed root in normal mode: PASS, 14.300 s; all 17 subcases PASS, + including both FK-publication directions; zero failures/skips. +- Exact failed root under `-race`: PASS, 33.390 s; all 17 subcases PASS, + zero failures/skips and no race report. Adaptive stress budget B=30 s gives + N=clamp(floor(30/33.390),1,100)=1; the measured exact-root run supplies that + one execution. Build time is excluded from this measurement. +- MV-focused frontend/compile/plan/v4_0_15 tests: all four packages PASS, + covering current 115 and immediately preceding 114 admission boundaries. +- Full owning frontend: PASS, 23.589 s; compile: PASS, 10.006 s; + plan: PASS, 22.058 s; v4_0_15: PASS, 0.055 s. +- Six-package vet PASS; configured incremental golangci-lint 2.14.0 reports + 0 issues. Formatting, unresolved-entry and diff whitespace checks PASS. + +Logs: `/workspace/mv-ci/issue29400-{fixed,race}.jsonl`, +`issue29400-mv-protocol.log`, `issue29400-owning.log`, `issue29400-vet.log` +and `issue29400-lint.log`. The exact failing concurrency group is the owning +test closure; unrelated issue roots are left to full CI. Normal/race timing is +functional evidence, not a performance comparison to the slow CI runner. +No new blockers were found in final-scope self-review. The new remote CI result +and the existing external design/re-review gates remain separate. + +### 2026-10-16: preserve calendar protocol and temporary DELETE on main merge + +Head `065e4d77dd0cbccfbd686a3bb362721ba82a0f09` completed ALL CI +[38760090521](https://github.com/matrixorigin/matrixone/actions/runs/38760090521) +successfully, including ordinary UT, coverage UT, SCA, shared build, both +multi-CN BVT groups, coverage aggregation and CI Required. Exact-head +Connector/J Pool Reset E2E `38760095747` and Iceberg Connector E2E +`38760095799` also completed successfully. Optional jobs explicitly skipped by +their workflows are not counted as passing tests. + +Main then advanced to `a85d90efc996dfa2621211ec592be4721fd3cb61`. +The two conflicted source files cover independent contracts: + +- R3 compatibility: preserve upstream calendar DAY/SECOND normalization at + protocol 115; move MV authoring, scan, registration and 4.0.15 upgrade + admission together to 116. Update the existing typed boundary cases so 115 + rejects MV operations and 116 admits them, while ordinary scans still admit + at 115. Calendar-expression gates remain 115. No persisted definition format, + task executor ID, catalog version or generated parser/protobuf changes. +- R2 DELETE planning: both base-table and index-maintenance truncate eligibility + require an unrestricted DELETE, a persistent target and a non-MV target. + Keeping only either side of the conflict would respectively lose temporary + table rollback safety or MV identity preservation during atomic refresh. + Keep both predicates. A lightweight planner regression asserts the typed + origin DELETE node retains the MV relation, with ordinary-table truncate as + the nearest control; reuse upstream's temporary DELETE regression. No new + cluster, rows, timers, retries, hooks or stateful mechanism is introduced. + +Automatic merges retain upstream metadata SHOW authorization, LAST_INSERT_ID +retry baselines and final ALTER/FK names alongside the existing MV guards. +Upstream's added cross-CN SYNCCOMMIT fences in the previously failing +`TestIssue29400CopyAlterRetainedGatePromotionFastFails` are retained; its FK +publication waiter keeps the explicit child cancellation fix under the existing +outer deadline. Because that fixture changed, its earlier normal/race results +are historical evidence and the exact root is selected again. + +This is conflict-resolution maintenance of the existing contracts, with no new +feature/design scope. External RFC revision 3 review and the existing Request +changes remain separate release/merge gates. New-head remote CI is required; +the green 065e4d77 run does not establish success after this merge. + +Validation on the merged source (Go 1.27.1, linux/amd64, repository CGo wrapper, +`matrixone_test`, `-short`, `-count=1`): + +- MV/calendar/temporary-DELETE focused tests: plan 0.160 s, compile 0.102 s, + frontend 0.078 s and v4_0_15 0.048 s, all PASS. The new MV origin-DELETE + identity oracle and ordinary-table control are selected and PASS. +- Full owning suites: frontend 17.079 s, compile 10.092 s, plan 26.073 s and + v4_0_15 0.073 s, all PASS. +- Exact formerly failing concurrency root: normal PASS 10.460 s, race PASS + 38.540 s. All 17 subcases PASS in each mode; zero failures/skips and no race + report. B=30 s yields N=clamp(floor(30/38.540),1,100)=1, supplied by the + measured race run. Build time is excluded. Test-local synchronization needs + this exact root; unrelated issue roots remain the full-CI responsibility. +- Six-package vet PASS and configured incremental lint 2.14.0 reports 0 issues. + Formatting, whitespace and unresolved-index checks PASS. Main's Makefile + changes affect UT scheduling only; CGo/thirdparty sources, build flags and + native artifacts remain unchanged. No benchmark is needed for the constant + protocol allocation and constant-cost planner predicate conjunction. + +Logs: `/workspace/mv-ci/main-a85-{focused,owning,vet,lint}.log` and +`main-a85-{root,race}.jsonl`. Both test processes terminated successfully; +there is no surviving native fixture. Source/self-review found no new blocker +in this maintenance scope. New-head multi-CN SQL BVT and full CI remain remote +checks, separately from the green parent-head evidence and external design +approval. + +### 2026-10-16: follow-up main merge preserves SELECT division protocol + +While exact-head ALL CI `38835654106` was running for +`6e5cffc74fd47905b0807a5f99ea63681b724a55`, main advanced from a85d90ef to +`76deafc8062f9a7e33a31a4df858ebcdb9477cb5`. GitHub then reported a new +content conflict. The existing run had passed shared build, SCA, coverage UT, +Connector/J and Iceberg; ordinary UT and both BVT jobs were still running. +This is a new protocol allocation collision, not a failed CI assertion. + +Preserve upstream SELECT scalar division diagnostics at protocol 116 and +move all MV authoring/scan/registration/4.0.15 upgrade gates together to 117. +Existing typed tests now reject MV protocol/floor 116 and admit 117, retaining +the ordinary-scan control at 116. The previous temporary-table/MV truncate +predicate conjunction and its identity regression are unchanged. Upstream's +ProcessInfo outer-SELECT classification and generated protobuf are accepted +unchanged, as is its checkpoint object-data sharing fix. There is no new +feature or design scope in this maintenance merge. + +Evidence reuse is scoped: the exact FK lifecycle test and its fixture are +unchanged from 6e5cffc7, including its cancellable waiter, original deadline, +cross-CN fences, cleanup owners and all 17 assertion scenarios. The new division +policy only affects division expressions, which that root does not issue; +checkpoint-version replay is not entered by its fresh, non-restarting fixture. +The prior race PASS (38.540 s, 17 subcases, no race report) remains evidence +for that unchanged waiter/holder cancellation closure, not new diagnostic or +checkpoint behavior. Fresh normal-root validation and focused division codec/ +protocol consumers validate the new base; full new-head CI remains required. + +The 6e5cffc7 native service was built with `vcs.modified=false` and passed +`view/materialized_view.sql` 58/58 under both optimistic and pessimistic modes, +twice on each instance. SQL plus ISCP readiness was observed. After each run, +the database and MV definition/dependency/run/task records were absent; both +owned services exited. Those observations are parent-head evidence; the new +merged source receives separate validation below. + +Parent-head ALL CI subsequently completed successfully on 6e5cffc7: +[38835654106](https://github.com/matrixorigin/matrixone/actions/runs/38835654106), +2026-10-16 01:32:17–02:35:57 UTC. Ordinary UT, coverage UT, SCA, shared build, +both multi-CN BVT groups, coverage aggregation and CI Required all PASS. +Connector/J and Iceberg also completed successfully. Explicit optional skips +remain skips. This closes the original CI failure on that revision; the new +main merge still needs separate exact-head CI. + +Fresh merged-source validation (Go 1.27.1, linux/amd64): + +- Focused MV/temporary DELETE/division diagnostic/SQL-mode/codec tests PASS: + plan 0.311 s, compile 0.113 s, frontend 0.142 s, v4_0_15 0.039 s and process + 0.052 s. This includes upstream division warning send/receive admission. +- Full owning suites PASS: frontend 15.464 s, compile 10.591 s, plan 28.136 s, + v4_0_15 0.047 s and process 1.152 s. +- Exact FK concurrency root freshly rerun: normal PASS 9.930 s, race PASS + 40.260 s, all 17 subcases PASS in both modes, no failure/skip/race report. + B=30 s gives N=clamp(floor(30/40.260),1,100)=1. Race build time is excluded; + `-vet=off` avoids repeating the separate seven-package successful vet check. +- Seven-package vet PASS; configured incremental lint 2.14.0: 0 issues. +- Production service build PASS. Native SQL normal comparison PASS 58/58 in + optimistic and pessimistic modes, twice per instance, zero ignored/failed/ + abnormal statements. SQL plus ISCP readiness observed. Every run verifies + zero test database, MV definitions, dependencies, refresh history and + executor-17 task records before repetition. Both services exited. + +The pre-delivery native binary reports baseline 6e5cffc7 with `vcs.modified=true`, +because it includes this staged main merge and protocol fix. It is not a clean +6e5cffc7 build. All 11,039 tracked non-documentation input blob identities were +recorded before the native run and checked against the final delivery index; +only this documentation/evidence changed afterward. Commit metadata and these +documentation edits do not affect the tested SQL behavior. CGo/thirdparty sources +and native build flags/artifacts are unchanged by this main merge. + +Logs: `/workspace/mv-ci/main-76de-{focused,owning,vet,lint}.log`, +`main-76de-{root,race}.jsonl`, `main-76de-native-build{,info}.log`, +`main-76de-bvt.json` and `main-76de-production-inputs.json`. Formatting, +whitespace, unresolved entries and final non-documentation input identity checks +PASS. No new blocker was found in this maintenance scope; external RFC review +and new-head remote CI remain separate gates. + + +### 2026-10-16: native upgrade and commit/ack crash evidence + +The exact previous head `d50c4c77513c08837cf6ba351fae047ff9728bd2` has +completed ALL CI `38843251708` successfully, including ordinary UT, coverage +UT/aggregation, arm64 SCA, shared build, both multi-CN BVT groups and CI Required. +Connector/J `38843254257` and Iceberg `38843254214` also succeeded. Optional +compatibility jobs were skipped. Review `5543067251` subsequently requested +native upgrade/recovery validation rather than reporting a new CI failure. + +The 4.0.15 handler has no tenant-upgrade phase; the framework's tenant protocol +check therefore does not consume its RequiredProtocolVersion. The handler now +checks the existing inventory gate before its first catalog DDL, failing closed +on an old node or inventory error. Existing creation/read/refresh gates remain. +Two bounded, disabled refresh fault points surround native publication; a +startup initializer exists only in an explicitly tagged instrumented binary. +No production startup environment control, new scheduler, persistent state, +protocol number, retry loop or catalog schema is introduced by this follow-up. + +The final isolated native run passes **12/12 groups in 288.732 seconds**, with +normal authenticated 4.0.14 SQL, mixed-version gate refusal, SIGKILL after two +staged catalog DDLs, automatic recovery/repetition, unsafe old-node refusal with +a populated periodic MV, native lost commit-response resolution, and real +periodic task crashes before commit and after commit/before acknowledgement. +The first post-restart result is last-good before the uncommitted replay, and +already-new after durable publication. Both actual queue identities acknowledge +on restart. Post-commit replay retains the exact result/run/sequence/source-TS/ +SUCCEEDED tuple; each task has one durable run. Teardown asserts no active +per-view tasks and observes completed-task GC reaching zero. All owned processes +exit: three expected SIGKILLs, the expected old-node refusal, other services +cleanly. No normal service failure is counted as a pass. + +Final normal MV/4.0.15 suites pass (0.057/0.044 s); complete bootstrap passes +(12.835 s). The exact refresh-failure root passes 100 race repetitions, with +zero failures/skips/race reports; measured T=0.010 s and B=30 s yield N=100. +The full MV race package passes (1.223 s). Five-package vet and configured lint +including the startup tag pass, with 0 lint issues. Tagged and ordinary native +service builds pass. The Python driver syntax and its real terminal exit are +checked separately. Baseline CI SQL/multi-CN evidence is not relabeled as a +new-head pass; final-head remote CI must run again. + +See `materialized_view_native_recovery.md`, the complete committed SQL/process +ledger `materialized_view_native_recovery_results.json`, and +`materialized_view_recovery_self_review.md`. The current pre-delivery binaries +report d50c4c77 with `vcs.modified=true`, not a pristine publication commit. +All 11,041 frozen tracked/new non-documentation inputs match at delivery; the +old archived source matches 11,132 tracked blobs of fcad62a8. Native service code +was unchanged after its build; final changes outside that build are test-only +cleanup, the process driver and documentation, separately validated. Logs and +full source-input ledgers remain in `/workspace/mv-ci/recovery-*` and the owned +`/tmp/mv-native-recovery-7` directory. No current-head performance result or +arbitrary release-pair compatibility is claimed. External re-review remains. + + +### 2026-10-16: license-policy correction and covered SQL bridge consumer + +Follow-up head `a9bff0c918e835da7aab474896d0f0476ded09c1`, ALL CI +`38862376845`, SCA job `116847424049`, failed its Static Code Analysis step +before the Go analyzers. The complete license-eye scan checked 6,381 files: +6,195 valid, 185 ignored and one invalid: +`cmd/mo-service/materialized_view_faults.go`. Its shortened Apache notice did +not satisfy the configured full header. Add the complete notice; the same +license-eye tool, configured for that changed path with the same license and +ignore rules, reports one valid and zero invalid. No license policy changes. +Both connector workflows and shared build on a9bff0c9 succeeded; other jobs +were still queued/running. The failed run is not presented as green. + +Inspection also found that the new native SQL bridge was exercised by the local +crash suite but not by the normal CI consumer. A direct coverage invocation +records 32 unexecuted blocks for that new package, while the prior d50c4c77 +aggregate was 894/1190 (75.13%). This is an execution-path gap, not an observed +new-head coverage verdict. Add real protocol/session/error checks to the +existing covered BVT entry rather than changing thresholds or exclusions. + +`test/materialized_view/native_probe/check.py` sends nine public requests in +one bridge lifetime: malformed JSON, invalid DSN, multi-row/NULL decoding, +Exec, session reuse, empty results, Query/Exec server errors and a subsequent +successful read. It repeats with a fresh bridge process against the same +native instance. Only session-local state changes. Both client lifetimes close +on EOF; the shell removes stale reports, verifies the new report, and merges +its normal covermode=set counters with the existing producer. The local bridge +counters cover 28/32 blocks (87.5%); this component result is not an aggregate +CI percentage. The CI consumer result ledger records full-entry validation. + +The 12-case native recovery capture remains tied to a9bff0c9. Service, upgrade +and bridge Go sources are byte-identical; the startup initializer's bytes from +its unchanged build tag onward are identical, with only the preceding license +comment expanded. The capture ledger records that semantic reuse explicitly. +New consumer checks are separate test-only inputs; the earlier complete input +fingerprint is not relabeled as byte-identical to this follow-up's test scripts. + + +Final covered-consumer validation passes the exact immutable entry script twice +on the same two-CN native instance: each run has 2 x 9 bridge requests and +70 functional + 5 failure + 9 cross-CN checks. Independent post-run database, +definition, dependency, run and task counts are zero before repetition. All +owned services exit. `materialized_view_ci_bridge_results.json` retains both +runs, exact changed input hashes, license proof and component coverage. The +production Go service/bridge inputs are unchanged from the 12-case capture; +only the startup initializer license comment changes. Final-head remote SCA, +UT, coverage and BVT remain required separately. + + +### 2026-10-16: mixed-version coordinator publication counterexample + +Raw old-CN logs from the earlier 12-case capture show the old fcad62a8 CN +fetching `materialized-view-reconcile-v1:1/17` and reporting `executor with code +17 not exists` at 06:29:34 UTC. Catalog DDL was blocked correctly, but the CN +registered the new reconcile cron independently of catalog/protocol readiness. +The old native suite omitted that negative assertion. Its selected passes do +not establish task exclusion; the current ledger supersedes it with 13 groups. + +Move admission to the first publisher: `mv.Service.RegisterCron` checks all +four committed catalogs and common protocol >=117 before creating any cron +metadata. Reuse the existing CN stopper-owned retry loop by passing its create +operation as a callback; lineage GC retains its original metadata/expression. +Missing/partial catalogs, inventory/query errors and old protocols publish no +task metadata. No task-registry/scheduler/protocol/catalog-policy redesign. + +Eight admission scenarios pass; the retry fixture proves a readiness rejection, +a subsequent task-store rejection and eventual registration under one retry +owner. Full MV/CN owning suites pass normally (0.057/8.337 s) and under race +(1.219/9.961 s). Both exact concurrency roots pass 100 race repetitions (T is +below measured resolution, N=100). Initial full CN race inherited the author's +3-GiB memory cap and failed the unrelated default-limit assertion: actual +3221225472 versus expected MaxInt64. Same code passes with the normal unset +limit; no assertion/skip/source fix was made. Both logs remain available. +Two-package vet/incremental lint pass, 0 issues; tagged and normal builds pass. + +The strengthened native suite passes 13/13 groups in 324.111 s, with normal old +login, observed registration denial, zero executor-17 cron/async rows while old +nodes run, no old unknown-executor log, then successful upgrade, periodic +publication and both real crash/replay boundaries. All 11,042 frozen tracked +non-documentation inputs remain unchanged. Current binaries report f8a9127f +plus vcs.modified=true. Full SQL/process and counterexample evidence are in +`materialized_view_native_recovery_results.json` and +`materialized_view_task_admission_results.json`. All owned processes exit. + + +Final post-admission production-consumer proof: the exact entry passes twice +on the same two-CN instance, each with 18 bridge requests and 70 functional, +5 failure and 9 cross-CN checks. Independent cleanup counts are zero after +each run and all services exit. Bridge counters remain 28/32 blocks; no +coverage-policy change. All 11,042 frozen inputs match. The new source/result +ledger supersedes the earlier consumer-only capture. Final-head remote CI +remains separate. + + +## Upstream protocol 117 allocation collision + +While cd5de147 ALL CI was running, upstream main 9f873692e0 added protocol +117 for collation-aware LEAST/GREATEST semantics and made this PR conflict. +Retain upstream's 117 contract and allocate 118 to native MVs across the +4.0.15 migration, coordinator publication, frontend DDL, plan authoring and +compile registration/scan consumers. A 117 node is the nearest unsupported +MV consumer even though its collation feature is supported. Catalog version +4.0.15, task executor 17, retry ownership and feature scope do not change. +The combined parser is regenerated from grammar; its one changed action +preserves upstream COLLATE expression nodes. + +R3 compatibility closure: typed tests reject MV protocol/floor 117 and admit +118 while ordinary scans and collation's 117 contract retain their controls. +Reuse the native destructive driver with a clean real upstream 117 binary +and verify its actual protocol inventory via normal authenticated SQL. This +changes no concurrency primitive, state owner or hot path; previous race +proof remains evidence for those unchanged mechanisms. Final normal suites, +static checks, new binaries and native/BVT results are recorded separately. +Pre-merge 117 captures remain historical evidence for their source, not the +new allocation. The old cd5 CI cannot establish the subsequent merge head. + + +Final protocol-118 validation: eight complete owning suites pass (defines, +4.0.15, MV, frontend, plan, compile, mysql parser and CN); upstream 117 +collation controls in function/PB plan pass. Six-package vet and configured +incremental lint pass with zero issues. Clean real upstream 117 and tagged/ +normal 118 service builds succeed. The native run passes 13/13 groups in +324.495 seconds, including actual 117 inventory, no premature catalog/tasks, +interrupted/repeated upgrade, 118-vs-117 downgrade refusal and both commit/ack +crash windows. Its committed JSON includes the upgrade wait stack and native +protocol/admission diagnostic excerpts, not only local filesystem references. + +The exact covered BVT entry passes twice on the same two-CN production +instance: each has 18 bridge requests plus 70/5/9 functional/failure/cross-CN +checks, independent zero cleanup counts, and all service processes reaped. +Bridge component counters are 28/32 regions and 50/56 statements; aggregate +coverage is a separate remote gate. All 11,061 frozen tracked non-documentation +inputs match. Pre-delivery new binaries report cd5de147 with modified=true; +the real upstream old binary reports clean 9f873692. + +One focused local link attempt exhausted the author cache disk. Old generated +cache entries were removed while protecting active import inputs, then full +owning suites passed; no source/assertion workaround was made. The cd5 remote +SCA/coverage-UT/Proxy results passed before this merge, but cannot establish +its final-head CI. Whitespace checking uses upstream as the delta base; main's +existing trailing-space CHAR collation golden values are preserved unchanged. + +The combined EXPLAIN consumer suite also passes (0.326 s), with its own +vet and configured incremental lint reporting zero issues. This closes the +additional auto-merged test consumer without changing source or existing +semantic input fingerprints. diff --git a/docs/design/materialized_view_native_recovery.md b/docs/design/materialized_view_native_recovery.md new file mode 100644 index 0000000000000..7c483fb1e4246 --- /dev/null +++ b/docs/design/materialized_view_native_recovery.md @@ -0,0 +1,157 @@ +# Native MV upgrade and crash validation + +## Current integration revision + +The current MV migration is 4.0.17/offset5 and protocol119; main owns +4.0.15/4.0.16 and charset118. Current native comparison uses exact main +3fc00709eccc277c175c7a09eed2605ca1aaee29 as the pre-feature control +(`--old-version 4.0.16 --old-protocol 118`). Historical tables/results below +retain their original input identity and are not current-head rerun claims. +The driver pins UTC for its sessions; named/fixed authoring semantics have +separate current public SQL controls. + +This supplements C07/C10/C12 in the P1 validation plan. The existing in-memory +failure tests and graceful restart check do not prove transaction durability or +task replay when a CN process dies. The process-owning driver is +`optools/materialized_view_recovery.py`; its SQL client is +`test/materialized_view/native_probe`. It uses normal authenticated SQL and the +actual bootstrap, transaction, catalog, task-service and scheduler owners. + +## Contracts and test boundaries + +| Scenario | Observable oracle | +| --- | --- | +| Real 4.0.14 deployment | Normal login, persisted ready version 4.0.14, no MV catalogs, two ordinary rows summing to 30 | +| Mixed old/new nodes | Native protocol inventory blocks the first MV catalog DDL; registration visibly declines before task publication; the normal old session sees zero executor-17 cron and async rows; no unknown-executor log; new-node login waits for upgrade | +| Interrupted migration | A tagged startup fault waits after the second real DDL in the owning transaction; stack confirms the handler's wait; SIGKILL ends only the upgrader | +| Migration recovery/repetition | Restart with injection absent completes the pending route; all four catalogs exist exactly once, one 4.0.15/offset-4 target is ready, source rows survive; another normal restart preserves these assertions | +| Unsafe downgrade | Start the actual old binary while a populated periodic MV exists; its normal startup must exit with the persisted protocol or cluster-version fence; no executor-17 task is assigned to it and the full result/provenance tuple survives | +| Lost commit response | ECHO(1) after native `ExecTxn` commits, before the refresh owner receives acknowledgement; fault hit count is one; the real durable-state read returns success, matching rows/timestamps and SUCCEEDED history, with no FAILED run | +| Crash before publication | Real periodic task waits after staging rows, provenance and SUCCEEDED status but before commit; another session sees the entire last-good tuple and RUNNING history; queue status is Running; SIGKILL only the CN | +| Crash after publication/before acknowledgement | The entire new tuple and SUCCEEDED history are already visible while the same periodic task is still Running; SIGKILL only the CN | +| Restart/replay | Inspect the first post-restart tuple, then await acknowledgement/GC of the same queue identity; the same 64-character run ID and sequence succeeds exactly once; row values and both source timestamps agree; source TS advances; post-commit replay preserves the exact published tuple | +| Teardown | Native DROP removes the MV/database, definitions, dependencies and history; require no active per-view tasks, then observe existing HAKeeper GC remove completed queue rows | + +The two refresh faults are disabled by default and add two atomic fault-registry +lookups per full refresh, never per source row. The migration fault has four +lookups in a one-time upgrade. The startup environment initializer is compiled +only with `matrixone_mv_faults`; production builds have no such environment +entry. WAIT honors the existing operation context. The driver observes actual +waiters/hit counts, uses SIGKILL rather than a graceful service stop, and never +edits task/run status, cluster/account version rows or catalog schemas to fake +recovery. Existing completed-task GC is asynchronous; a Completed queue row is +not an active leak and is not required to disappear in the DROP statement. + +The upgrade handler must check the common protocol itself: its +`UpgradeTenant=No` metadata means the framework's tenant-upgrade protocol check +does not run. Installing persistent MV catalogs now fails closed before any DDL +while an inventoried node is below protocol 118 or the inventory query fails. +Creation/read/refresh gates and the existing persisted protocol startup fence +retain their separate responsibilities. + +## Reproduction + +Use the repository-supported Go/CGo toolchain and native libraries. Build a +normal production service as usual, plus a separate instrumented service: + +```sh +# Keep the instrumented binary beside the repository-staged native lib directory. +make build BUILD_TAGS=matrixone_mv_faults BIN_NAME=mo-service-mv-recovery +CGO_ENABLED=0 go build -mod=readonly \ + -o /tmp/mv-native-probe ./test/materialized_view/native_probe +python3 optools/materialized_view_recovery.py \ + --service "$PWD/mo-service-mv-recovery" \ + --old-service /absolute/path/to/pinned-main-mo-service \ + --old-version 4.0.16 --old-protocol 118 \ + --probe /tmp/mv-native-probe \ + --work-dir /tmp/a-new-mv-native-fixture +``` + +The latest tested old binary is a clean build of upstream main +`9f873692e0` (catalog 4.0.14, protocol 117), whose collation capability does not +include MVs. The driver verifies its actual protocol inventory through normal +SQL before testing the 118 fence. Earlier captures pinned pre-feature commit +`fcad62a8ff06000e682824802f1155cbeea02a2f` (catalog 4.0.14, protocol 112); +select `--old-protocol 112` for that binary. Both use normal authentication. +The current result artifact identifies the exact old and new source/binaries. + +Run from the repository root with free local ports 32001, 19000–19019, +18000–18019, 20000–20019, 6101–6102, 7301–7304 and 7603. The driver uses +`etc/launch` templates, disables auto-ID caching for this rolling topology, and +refuses an existing work directory. Separate LOG, TN and CN processes are +necessary to leave storage alive when the CN dies. The mixed-version phase +temporarily overlaps the old and new CN. Data cardinality is two rows; process +startup, inventory fencing and actual scheduling/replay dominate runtime. +There is no equivalent existing fixture covering these destructive boundaries; +ordinary BVT/UT CI does not start this isolated topology. + +All process handles are retained immediately and closed in the driver's finally +path, including assertion/SQL/deadline failures. Each SQL operation has a context +and a separate client-response guard; phase polling has an outer hang deadline. +Native logs, the interrupted-upgrade stack, generated configs, binary hashes, +SQL observations with attempt counts/state changes, process exit codes and the +terminal result remain in the owned work directory. A failure writes a nonempty +error and exits nonzero. Fixture data are retained for diagnosis; remove only +that stopped fixture's `data` directory when no longer needed. + +## Evidence scope + +`materialized_view_native_recovery_results.json` records the completed native +run. Instrumented native evidence is identified separately from the normal +production build and remote CI. The service build reports the pre-delivery +baseline plus `vcs.modified=true`; it must not be described as a pristine build +of the later publication commit. Source hashes and semantic input checks bridge +that delivery metadata boundary. + +These cases establish the selected old revision and local LOG/TN/CN topology. +They do not establish arbitrary release-pair compatibility, operator-directed +downgrade after removing the feature, every network/WAL fault, cold-cache tail +latency or scheduler-scale performance. Optional compatibility jobs skipped in +general CI remain skipped; the native run is separate evidence. External +implementation re-review and final-head CI are still required. + +The earlier 12-case capture passed its selected oracles but omitted mixed-version +task-publication exclusion. Its raw old-CN log exposed a claimed unknown executor +17. The current protocol-118 execution with a real protocol-117 old node passes +13/13 groups in 324.495 seconds, +including zero cron/async task metadata before migration. Three CN +processes exited by the expected SIGKILLs; the old binary exited at the expected +protocol fence; all remaining owned services exited cleanly. The pre-merge +admission/retry mechanism evidence includes owning race passes for MV (1.219 s) +and CN (9.961 s), plus 100 repetitions of each root; these are not represented +as new merge-head race executions. + + +## Normal CI consumer of the SQL bridge + +The existing `optools/run_materialized_view_bvt.sh` also builds the SQL bridge +with covermode=set and runs `test/materialized_view/native_probe/check.py` +against its existing primary CN. Two client lifetimes each verify nine requests: +malformed input/DSN, ordered multi-row SQL NULL decoding, empty results, +Exec/Query, persistent connection-local state and continued use after server +errors. It creates no database objects or service processes. Counters enter the +existing BVT coverage producer with unchanged thresholds/exclusions. The normal +entry still runs the 70 functional, five failure and nine two-CN cases. +The separate `materialized_view_ci_bridge_results.json` records this consumer. +The current recovery ledger supersedes the earlier capture after the task- +publication counterexample, and identifies its current pre-delivery inputs. + + +## Coordinator publication must precede execution eligibility + +A catalog migration barrier alone did not prevent the new CN from publishing +its executor-17 reconcile cron while old CNs were still running. The original +12-case run's old-CN log contains a fetched `materialized-view-reconcile-v1:1/17` +and `executor with code 17 not exists`. This is a real counterexample to task +capability exclusion, even though no MV object could yet be created. + +`mv.Service.RegisterCron` now checks all four installed catalogs and the +existing common protocol inventory before `TaskService.CreateCronTask`. +The CN's existing registration retry owner calls this operation; lineage GC +uses the same retry owner with its unchanged task metadata and cron expression. +There is no second scheduler, persistent state, new task code, feature-flag +bypass or unbounded retry owner. While the old topology remains, the native +suite observes an actual registration rejection and then requires zero typed +cron and async rows. The strengthened suite still proves publication and task +replay after upgrade. See `materialized_view_task_admission_results.json` for +the original raw log excerpt, exact before/after source identity and results. diff --git a/docs/design/materialized_view_native_recovery_results.json b/docs/design/materialized_view_native_recovery_results.json new file mode 100644 index 0000000000000..ab3008b518a5f --- /dev/null +++ b/docs/design/materialized_view_native_recovery_results.json @@ -0,0 +1,1113 @@ +{ + "passed_cases": [ + "ordinary authenticated 4.0.14 deployment", + "old nodes block MV catalog migration and new-CN login remains pending", + "mixed old nodes never receive MV cron or asynchronous task metadata", + "SIGKILL after two catalog DDLs before migration commit", + "interrupted migration recovers atomically with ordinary data intact", + "repeated automatic upgrade has exactly four catalogs and one ready target", + "old binary refuses downgrade with populated periodic MV before SQL/task admission", + "native durable commit response loss resolves to success", + "SIGKILL periodic refresh before_commit", + "restart and same-run replay before_commit", + "SIGKILL periodic refresh after_commit", + "restart and same-run replay after_commit", + "native fixture removes MV rows, dependencies, history and per-view tasks" + ], + "observations": { + "ordinary authenticated 4.0.14 deployment": [ + [ + "30" + ] + ], + "old nodes block MV catalog migration and new-CN login remains pending": { + "new_login": { + "error": "context deadline exceeded", + "rows": null + }, + "old_catalog_control": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + "old binary refuses downgrade with populated periodic MV before SQL/task admission": { + "exit_code": 2, + "fence": "requires persisted expression protocol version 118 (local version 117)" + }, + "native durable commit response loss resolves to success": [ + [ + "2", + "50", + "31faf0fe-3f0d-4cb1-bcc2-b8d0906e8376", + "2", + "1792140492808272084", + "1", + "SUCCEEDED", + "1792140492808272084", + "1" + ] + ], + "SIGKILL periodic refresh before_commit": { + "before": [ + [ + "2", + "50", + "31faf0fe-3f0d-4cb1-bcc2-b8d0906e8376", + "2", + "1792140492808272084", + "1", + "SUCCEEDED", + "1792140492808272084", + "1" + ] + ], + "at_barrier": [ + [ + "2", + "50", + "31faf0fe-3f0d-4cb1-bcc2-b8d0906e8376", + "2", + "1792140492808272084", + "1", + "SUCCEEDED", + "1792140492808272084", + "1" + ] + ], + "run": [ + "2925c910bdd87605539fd532c8f778ae7213c5f1423c1dcadb1e7d141f812d2f", + "3", + "RUNNING" + ], + "queue": [ + [ + "1", + "dd1dccb4-4d3c-41f8-b482-5251dc7a41bf" + ] + ] + }, + "restart and same-run replay before_commit": { + "after_restart": [ + [ + "2", + "50", + "31faf0fe-3f0d-4cb1-bcc2-b8d0906e8376", + "2", + "1792140492808272084", + "1", + "SUCCEEDED", + "1792140492808272084", + "1" + ] + ], + "after_ack": [ + [ + "2", + "80", + "2925c910bdd87605539fd532c8f778ae7213c5f1423c1dcadb1e7d141f812d2f", + "3", + "1792140593139438368", + "1", + "SUCCEEDED", + "1792140593139438368", + "1" + ] + ] + }, + "SIGKILL periodic refresh after_commit": { + "before": [ + [ + "2", + "80", + "2925c910bdd87605539fd532c8f778ae7213c5f1423c1dcadb1e7d141f812d2f", + "3", + "1792140593139438368", + "1", + "SUCCEEDED", + "1792140593139438368", + "1" + ] + ], + "at_barrier": [ + [ + "2", + "120", + "3e7308db6c94d25dfb7ddd72f22ae0f08bb98f652f493016cca400ade5a4cdd8", + "4", + "1792140633192332322", + "1", + "SUCCEEDED", + "1792140633192332322", + "1" + ] + ], + "run": [ + "3e7308db6c94d25dfb7ddd72f22ae0f08bb98f652f493016cca400ade5a4cdd8", + "4", + "SUCCEEDED" + ], + "queue": [ + [ + "1", + "dd1dccb4-4d3c-41f8-b482-5251dc7a41bf" + ] + ] + }, + "restart and same-run replay after_commit": { + "after_restart": [ + [ + "2", + "120", + "3e7308db6c94d25dfb7ddd72f22ae0f08bb98f652f493016cca400ade5a4cdd8", + "4", + "1792140633192332322", + "1", + "SUCCEEDED", + "1792140633192332322", + "1" + ] + ], + "after_ack": [ + [ + "2", + "120", + "3e7308db6c94d25dfb7ddd72f22ae0f08bb98f652f493016cca400ade5a4cdd8", + "4", + "1792140633192332322", + "1", + "SUCCEEDED", + "1792140633192332322", + "1" + ] + ] + } + }, + "binaries": { + "service": { + "path": "/tmp/mo-service-mv-protocol118", + "sha256": "64ad3b71c77cd3262b04248ab646606bde2df75ca04b1658a8ea385b6d7aeeac" + }, + "old_service": { + "path": "/tmp/mo-service-pre118", + "sha256": "3d2e91781b86f501b7dc8d562e50d3e8835427a89b85f7ecc5666371d3fbe12d" + }, + "probe": { + "path": "/tmp/mv-native-probe", + "sha256": "e00da3db2c5a0434ad350f39be42a804033a00fb21ba421817eb9fd0bd029296" + } + }, + "sql_observations": { + "old: select 1": { + "attempts": 11, + "changes": [ + { + "error": "dial tcp 127.0.0.1:6102: connect: connection refused", + "rows": null + }, + { + "error": "", + "rows": [ + [ + "1" + ] + ] + } + ] + }, + "old: select version,state from mo_catalog.mo_version order by create_at desc limit 1": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "4.0.14", + "2" + ] + ] + } + ] + }, + "old: select mo_ctl('cn','GetProtocolVersion','')": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "{\n \"method\": \"GETPROTOCOLVERSION\",\n \"result\": \"ee1dccb4-4d3c-41f8-b482-5251dc7a41bf:117, dd4dccb4-4d3c-41f8-b482-5251dc7a41bf:117\"\n}\n" + ] + ] + } + ] + }, + "old: create database mv_recovery": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": null + } + ] + }, + "old: create table mv_recovery.facts(id int primary key,v bigint)": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": null + } + ] + }, + "old: insert into mv_recovery.facts values(1,10),(2,20)": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": null + } + ] + }, + "old: select count(*) from mo_catalog.mo_tables where reldatabase='mo_catalog' and relname in ('mo_materialized_views','mo_mv_dependencies','mo_mv_refresh_runs','mo_mv_account_state')": { + "attempts": 2, + "changes": [ + { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + ] + }, + "old: select sum(v) from mv_recovery.facts": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "30" + ] + ] + } + ] + }, + "current: select 1": { + "attempts": 26, + "changes": [ + { + "error": "context deadline exceeded", + "rows": null + }, + { + "error": "dial tcp 127.0.0.1:6101: connect: connection refused", + "rows": null + }, + { + "error": "context deadline exceeded", + "rows": null + }, + { + "error": "", + "rows": [ + [ + "1" + ] + ] + }, + { + "error": "dial tcp 127.0.0.1:6101: connect: connection refused", + "rows": null + }, + { + "error": "", + "rows": [ + [ + "1" + ] + ] + }, + { + "error": "dial tcp 127.0.0.1:6101: connect: connection refused", + "rows": null + }, + { + "error": "context deadline exceeded", + "rows": null + }, + { + "error": "", + "rows": [ + [ + "1" + ] + ] + }, + { + "error": "dial tcp 127.0.0.1:6101: connect: connection refused", + "rows": null + }, + { + "error": "context deadline exceeded", + "rows": null + }, + { + "error": "", + "rows": [ + [ + "1" + ] + ] + } + ] + }, + "old: select count(*) from mo_task.sys_cron_task where task_metadata_executor=17": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + ] + }, + "old: select count(*) from mo_task.sys_async_task where task_metadata_executor=17": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + ] + }, + "current: select version,version_offset,state from mo_catalog.mo_version where version='4.0.15'": { + "attempts": 2, + "changes": [ + { + "error": "", + "rows": [ + [ + "4.0.15", + "4", + "2" + ] + ] + } + ] + }, + "current: select relname,count(*) from mo_catalog.mo_tables where account_id=0 and reldatabase='mo_catalog' and relname in ('mo_materialized_views','mo_mv_dependencies','mo_mv_refresh_runs','mo_mv_account_state') group by relname order by relname": { + "attempts": 2, + "changes": [ + { + "error": "", + "rows": [ + [ + "mo_materialized_views", + "1" + ], + [ + "mo_mv_account_state", + "1" + ], + [ + "mo_mv_dependencies", + "1" + ], + [ + "mo_mv_refresh_runs", + "1" + ] + ] + } + ] + }, + "current: select sum(v) from mv_recovery.facts": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "30" + ] + ] + } + ] + }, + "current: set experimental_materialized_view=1": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": null + } + ] + }, + "current: create materialized view mv_recovery.result refresh every interval 1 day as select count(*) as n,sum(v) as s from mv_recovery.facts": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": null + } + ] + }, + "current: refresh materialized view mv_recovery.result": { + "attempts": 2, + "changes": [ + { + "error": "", + "rows": null + } + ] + }, + "current: select m.n,m.s,v.last_run,v.successful_sequence,v.source_physical,v.source_logical,r.status,r.source_physical,r.source_logical from mv_recovery.result m,mo_catalog.mo_materialized_views v,mo_catalog.mo_mv_refresh_runs r where v.account_id=0 and v.database_name='mv_recovery' and v.name='result' and r.account_id=v.account_id and r.mv_id=v.mv_id and r.run_id=v.last_run": { + "attempts": 11, + "changes": [ + { + "error": "", + "rows": [ + [ + "2", + "30", + "2961686f-7fe5-43ba-9d48-79536789e452", + "1", + "1792140491300258000", + "1", + "SUCCEEDED", + "1792140491300258000", + "1" + ] + ] + }, + { + "error": "", + "rows": [ + [ + "2", + "50", + "31faf0fe-3f0d-4cb1-bcc2-b8d0906e8376", + "2", + "1792140492808272084", + "1", + "SUCCEEDED", + "1792140492808272084", + "1" + ] + ] + }, + { + "error": "", + "rows": [ + [ + "2", + "80", + "2925c910bdd87605539fd532c8f778ae7213c5f1423c1dcadb1e7d141f812d2f", + "3", + "1792140593139438368", + "1", + "SUCCEEDED", + "1792140593139438368", + "1" + ] + ] + }, + { + "error": "", + "rows": [ + [ + "2", + "120", + "3e7308db6c94d25dfb7ddd72f22ae0f08bb98f652f493016cca400ade5a4cdd8", + "4", + "1792140633192332322", + "1", + "SUCCEEDED", + "1792140633192332322", + "1" + ] + ] + } + ] + }, + "current: select count(*) from mo_task.sys_async_task where task_metadata_executor=17 and task_runner='ee1dccb4-4d3c-41f8-b482-5251dc7a41bf'": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + ] + }, + "current: select mo_ctl('cn','GetProtocolVersion','')": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "{\n \"method\": \"GETPROTOCOLVERSION\",\n \"result\": \"dd1dccb4-4d3c-41f8-b482-5251dc7a41bf:118, dd4dccb4-4d3c-41f8-b482-5251dc7a41bf:118\"\n}\n" + ] + ] + } + ] + }, + "current: update mv_recovery.facts set v=25": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": null + } + ] + }, + "current: select enable_fault_injection()": { + "attempts": 3, + "changes": [ + { + "error": "", + "rows": [ + [ + "1" + ] + ] + } + ] + }, + "current: select add_fault_point('mv_refresh_after_commit',':::','echo',1,'')": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "1" + ] + ] + } + ] + }, + "current: select add_fault_point('mv_probe_waiters',':::','getwaiters',0,'mv_refresh_after_commit')": { + "attempts": 2, + "changes": [ + { + "error": "", + "rows": [ + [ + "1" + ] + ] + } + ] + }, + "current: select add_fault_point('mv_probe_count',':::','getcount',0,'mv_refresh_after_commit')": { + "attempts": 2, + "changes": [ + { + "error": "", + "rows": [ + [ + "1" + ] + ] + } + ] + }, + "current: select trigger_fault_point('mv_probe_count')": { + "attempts": 3, + "changes": [ + { + "error": "", + "rows": [ + [ + "1" + ] + ] + } + ] + }, + "current: select count(*) from mo_catalog.mo_mv_refresh_runs where status='FAILED'": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + ] + }, + "current: select disable_fault_injection()": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "1" + ] + ] + } + ] + }, + "current: update mv_recovery.facts set v=40": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": null + } + ] + }, + "current: select add_fault_point('mv_refresh_before_commit',':::','wait',0,'')": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "1" + ] + ] + } + ] + }, + "current: select add_fault_point('mv_probe_waiters',':::','getwaiters',0,'mv_refresh_before_commit')": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "1" + ] + ] + } + ] + }, + "current: select add_fault_point('mv_probe_count',':::','getcount',0,'mv_refresh_before_commit')": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "1" + ] + ] + } + ] + }, + "current: update mo_catalog.mo_materialized_views set next_due=current_timestamp() where account_id=0 and database_name='mv_recovery' and name='result'": { + "attempts": 2, + "changes": [ + { + "error": "", + "rows": null + } + ] + }, + "current: select trigger_fault_point('mv_probe_waiters')": { + "attempts": 358, + "changes": [ + { + "error": "", + "rows": [ + [ + "0" + ] + ] + }, + { + "error": "", + "rows": [ + [ + "1" + ] + ] + }, + { + "error": "", + "rows": [ + [ + "0" + ] + ] + }, + { + "error": "", + "rows": [ + [ + "1" + ] + ] + } + ] + }, + "current: select run_id,sequence,status from mo_catalog.mo_mv_refresh_runs where account_id=0 and mv_id=(select mv_id from mo_catalog.mo_materialized_views where account_id=0 and database_name='mv_recovery' and name='result') order by sequence desc limit 1": { + "attempts": 2, + "changes": [ + { + "error": "", + "rows": [ + [ + "2925c910bdd87605539fd532c8f778ae7213c5f1423c1dcadb1e7d141f812d2f", + "3", + "RUNNING" + ] + ] + }, + { + "error": "", + "rows": [ + [ + "3e7308db6c94d25dfb7ddd72f22ae0f08bb98f652f493016cca400ade5a4cdd8", + "4", + "SUCCEEDED" + ] + ] + } + ] + }, + "current: select task_status,task_runner from mo_task.sys_async_task where task_metadata_id='mv:2925c910bdd87605539fd532c8f778ae7213c5f1'": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "1", + "dd1dccb4-4d3c-41f8-b482-5251dc7a41bf" + ] + ] + } + ] + }, + "current: select task_status from mo_task.sys_async_task where task_metadata_id='mv:2925c910bdd87605539fd532c8f778ae7213c5f1'": { + "attempts": 40, + "changes": [ + { + "error": "", + "rows": [ + [ + "1" + ] + ] + }, + { + "error": "", + "rows": [ + [ + "2" + ] + ] + } + ] + }, + "current: select count(*) from mo_catalog.mo_mv_refresh_runs where run_id='2925c910bdd87605539fd532c8f778ae7213c5f1423c1dcadb1e7d141f812d2f'": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "1" + ] + ] + } + ] + }, + "current: update mv_recovery.facts set v=60": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": null + } + ] + }, + "current: select add_fault_point('mv_refresh_after_commit',':::','wait',0,'')": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "1" + ] + ] + } + ] + }, + "current: select task_status,task_runner from mo_task.sys_async_task where task_metadata_id='mv:3e7308db6c94d25dfb7ddd72f22ae0f08bb98f65'": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "1", + "dd1dccb4-4d3c-41f8-b482-5251dc7a41bf" + ] + ] + } + ] + }, + "current: select task_status from mo_task.sys_async_task where task_metadata_id='mv:3e7308db6c94d25dfb7ddd72f22ae0f08bb98f65'": { + "attempts": 36, + "changes": [ + { + "error": "", + "rows": [ + [ + "1" + ] + ] + }, + { + "error": "", + "rows": [ + [ + "2" + ] + ] + } + ] + }, + "current: select count(*) from mo_catalog.mo_mv_refresh_runs where run_id='3e7308db6c94d25dfb7ddd72f22ae0f08bb98f652f493016cca400ade5a4cdd8'": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "1" + ] + ] + } + ] + }, + "current: drop materialized view mv_recovery.result": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": null + } + ] + }, + "current: drop database mv_recovery": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": null + } + ] + }, + "current: select count(*) from mo_catalog.mo_materialized_views": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + ] + }, + "current: select count(*) from mo_catalog.mo_mv_dependencies": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + ] + }, + "current: select count(*) from mo_catalog.mo_mv_refresh_runs": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + ] + }, + "current: select count(*) from mo_task.sys_async_task where task_metadata_id like 'mv:%' and task_status<>2": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + ] + }, + "current: select count(*) from mo_task.sys_async_task where task_metadata_id like 'mv:%'": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + ] + } + }, + "old_protocol": 117, + "process_exits": { + "old-storage-log": 0, + "old-storage-tn": 0, + "old-bootstrap": 0, + "new-mixed": 0, + "new-storage-log": 0, + "new-storage-tn": 0, + "new-staged-migration": -9, + "new-migration-recovery": 0, + "new-migration-repeat": -9, + "unsafe-downgrade": 2, + "recovery-before_commit": -9, + "recovery-after_commit": 0 + }, + "elapsed_seconds": 324.4950897330127, + "scope": { + "parent": "cd5de147d5043ff1795bfb430714afcc9019f144", + "merged_main": "9f873692e0efa869c64c4d1c84e212c5a8a3272a", + "old_source": { + "revision": "9f873692e0efa869c64c4d1c84e212c5a8a3272a", + "catalog": "4.0.14", + "protocol": 117, + "clean": true, + "vcs": "/tmp/mo-service-pre118: go1.27.1\n\tpath\tgithub.com/matrixorigin/matrixone/cmd/mo-service\n\tmod\tgithub.com/matrixorigin/matrixone\tv0.0.0-20261016082801-9f873692e0ef\t\n\tdep\tfilippo.io/edwards25519\tv1.1.1\th1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw=\n\tdep\tgithub.com/BurntSushi/toml\tv1.2.1\th1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=\n\tdep\tgithub.com/DataDog/zstd\tv1.5.0\th1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo=\n\tdep\tgithub.com/FastFilter/xorfilter\tv0.5.1\th1:UjtPttI1SnKWUmeQKu8Y+4ZvMJv7KP6/NZTsGBPQY08=\n\tdep\tgithub.com/KimMachineGun/automemlimit\tv0.6.0\th1:p/BXkH+K40Hax+PuWWPQ478hPjsp9h1CPDhLlA3Z37E=\n\tdep\tgithub.com/Masterminds/semver/v3\tv3.2.1\th1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=\n\tdep\tgithub.com/RoaringBitmap/roaring/v2\tv2.16.0\th1:Kys1UNf49d5W8Tq3bpuAhIr/Z8/yPB+59CO8A6c/BbE=\n\tdep\tgithub.com/VictoriaMetrics/metrics\tv1.18.1\th1:OZ0+kTTto8oPfHnVAnTOoyl0XlRhRkoQrD2n2cOuRw0=\n\tdep\tgithub.com/alibabacloud-go/debug\tv1.0.1\th1:MsW9SmUtbb1Fnt3ieC6NNZi6aEwrXfDksD4QA6GSbPg=\n\tdep\tgithub.com/alibabacloud-go/tea\tv1.2.2\th1:aTsR6Rl3ANWPfqeQugPglfurloyBJY85eFy7Gc1+8oU=\n\tdep\tgithub.com/aliyun/alibaba-cloud-sdk-go\tv1.63.34\th1:eZM2MHY/p4TFO1pGf9O5HiuYE59hwrrkf3HvCtkL5Ok=\n\tdep\tgithub.com/aliyun/aliyun-oss-go-sdk\tv3.0.2+incompatible\th1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g=\n\tdep\tgithub.com/aliyun/credentials-go\tv1.3.10\th1:45Xxrae/evfzQL9V10zL3xX31eqgLWEaIdCoPipOEQA=\n\tdep\tgithub.com/andres-erbsen/clock\tv0.0.0-20160526145045-9e14626cd129\th1:MzBOUgng9orim59UnfUTLRjMpd09C5uEVQ6RPGeCaVI=\n\tdep\tgithub.com/andybalholm/brotli\tv1.2.2\th1:HzTuoo2ErYQqf5qvcJInB8uvqSVxRttzkFexPWtnceM=\n\tdep\tgithub.com/apache/arrow-go/v18\tv18.7.0\th1:Vw/i+cJyebUofT7JlqFpe65LrmwxULn166jjwStM4HY=\n\tdep\tgithub.com/armon/go-metrics\tv0.4.1\th1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\n\tdep\tgithub.com/aws/aws-sdk-go\tv1.55.5\th1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=\n\tdep\tgithub.com/aws/aws-sdk-go-v2\tv1.41.5\th1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/aws/protocol/eventstream\tv1.7.8\th1:eBMB84YGghSocM7PsjmmPffTa+1FBUeNvGvFou6V/4o=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/config\tv1.32.14\th1:opVIRo/ZbbI8OIqSOKmpFaY7IwfFUOCCXBsUpJOwDdI=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/credentials\tv1.19.14\th1:n+UcGWAIZHkXzYt87uMFBv/l8THYELoX6gVcUvgl6fI=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/feature/ec2/imds\tv1.18.21\th1:NUS3K4BTDArQqNu2ih7yeDLaS3bmHD0YndtA6UP884g=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/configsources\tv1.4.21\th1:Rgg6wvjjtX8bNHcvi9OnXWwcE0a2vGpbwmtICOsvcf4=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/endpoints/v2\tv2.7.21\th1:PEgGVtPoB6NTpPrBgqSE5hE/o47Ij9qk/SEZFbUOe9A=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/ini\tv1.8.6\th1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/v4a\tv1.4.22\th1:rWyie/PxDRIdhNf4DzRk0lvjVOqFJuNnO8WwaIRVxzQ=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/accept-encoding\tv1.13.7\th1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/checksum\tv1.9.13\th1:JRaIgADQS/U6uXDqlPiefP32yXTda7Kqfx+LgspooZM=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/presigned-url\tv1.13.21\th1:c31//R3xgIJMSC8S6hEVq+38DcvUlgFY0FM6mSI5oto=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/s3shared\tv1.19.21\th1:ZlvrNcHSFFWURB8avufQq9gFsheUgjVD9536obIknfM=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/s3\tv1.99.0\th1:hlSuz394kV0vhv9drL5lhuEFbEOEP1VyQpy15qWh1Pk=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/signin\tv1.0.9\th1:QKZH0S178gCmFEgst8hN0mCX1KxLgHBKKY/CLqwP8lg=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/sso\tv1.30.15\th1:lFd1+ZSEYJZYvv9d6kXzhkZu07si3f+GQ1AaYwa2LUM=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/ssooidc\tv1.35.19\th1:dzztQ1YmfPrxdrOiuZRMF6fuOwWlWpD2StNLTceKpys=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/sts\tv1.41.10\th1:p8ogvvLugcR/zLBXTXrTkj0RYBUdErbMnAFFp12Lm/U=\n\tdep\tgithub.com/aws/smithy-go\tv1.24.3\th1:XgOAaUgx+HhVBoP4v8n6HCQoTRDhoMghKqw4LNHsDNg=\n\tdep\tgithub.com/axiomhq/hyperloglog\tv0.2.6\th1:sRhvvF3RIXWQgAXaTphLp4yJiX4S0IN3MWTaAgZoRJw=\n\tdep\tgithub.com/beorn7/perks\tv1.0.1\th1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\n\tdep\tgithub.com/bits-and-blooms/bitset\tv1.24.2\th1:M7/NzVbsytmtfHbumG+K2bremQPMJuqv1JD3vOaFxp0=\n\tdep\tgithub.com/blevesearch/mmap-go\tv1.2.0\th1:l33nNKPFcBjJUMwem6sAYJPUzhUCABoK9FxZDGiFNBI=\n\tdep\tgithub.com/blevesearch/vellum\tv1.2.0\th1:xkDiOEsHc2t3Cp0NsNZZ36pvc130sCzcGKOPMzXe+e0=\n\tdep\tgithub.com/buger/jsonparser\tv1.1.2\th1:frqHqw7otoVbk5M8LlE/L7HTnIq2v9RX6EJ48i9AxJk=\n\tdep\tgithub.com/bytedance/gopkg\tv0.1.3\th1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M=\n\tdep\tgithub.com/bytedance/sonic\tv1.15.2\th1:90H+rcF/FwLXwfB1cudOLq/je83n683Utf4Cbp0xHCo=\n\tdep\tgithub.com/cespare/xxhash/v2\tv2.3.0\th1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\n\tdep\tgithub.com/cilium/ebpf\tv0.21.0\th1:4dpx1J/B/1apeTmWBH5BkVLayHTkFrMovVPnHEk+l3k=\n\tdep\tgithub.com/clbanning/mxj\tv1.8.4\th1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I=\n\tdep\tgithub.com/clipperhouse/uax29/v2\tv2.7.0\th1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk=\n\tdep\tgithub.com/cockroachdb/errors\tv1.9.1\th1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8=\n\tdep\tgithub.com/cockroachdb/logtags\tv0.0.0-20230118201751-21c54148d20b\th1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=\n\tdep\tgithub.com/cockroachdb/pebble\tv0.0.0-20220407171941-2120d145e292\th1:7fLxcRpQTdi1iic0cIUpK+hKKLM5XdPhEbWRRrxfvLU=\n\tdep\tgithub.com/cockroachdb/redact\tv1.1.3\th1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ=\n\tdep\tgithub.com/colinmarc/hdfs/v2\tv2.4.0\th1:v6R8oBx/Wu9fHpdPoJJjpGSUxo8NhHIwrwsfhFvU9W0=\n\tdep\tgithub.com/containerd/cgroups/v3\tv3.1.3\th1:eUNflyMddm18+yrDmZPn3jI7C5hJ9ahABE5q6dyLYXQ=\n\tdep\tgithub.com/containerd/log\tv0.1.0\th1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=\n\tdep\tgithub.com/coreos/go-systemd/v22\tv22.7.0\th1:LAEzFkke61DFROc7zNLX/WA2i5J8gYqe0rSj9KI28KA=\n\tdep\tgithub.com/cpegeric/pdftotext-go\tv0.0.0-20241112123704-49cb86a3790e\th1:tQSCiEjYPRU+AuuVR+zd+xYVOsEqX1clPhmIAM6FCHU=\n\tdep\tgithub.com/davecgh/go-spew\tv1.1.2-0.20180830191138-d8f796af33cc\th1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\n\tdep\tgithub.com/detailyang/go-fallocate\tv0.0.0-20180908115635-432fa640bd2e\th1:lj77EKYUpYXTd8CD/+QMIf8b6OIOTsfEBSXiAzuEHTU=\n\tdep\tgithub.com/dgryski/go-metro\tv0.0.0-20250106013310-edb8663e5e33\th1:ucRHb6/lvW/+mTEIGbvhcYU3S8+uSNkuMjx/qZFfhtM=\n\tdep\tgithub.com/dlclark/regexp2\tv1.10.0\n\t=>\tgithub.com/XuPeng-SH/regexp2\tv1.10.1-0.20261004024751-718f43e031fe\th1:7TlZYr/D2KQlZ2lwGehHN7Ix3ICj43OXaZx2UT4DOIo=\n\t\n\tdep\tgithub.com/docker/go-units\tv0.5.0\th1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=\n\tdep\tgithub.com/dolthub/maphash\tv0.1.0\th1:bsQ7JsF4FkkWyrP3oCnFJgrCUAFbFf3kOl4L/QxPDyQ=\n\tdep\tgithub.com/dslipak/pdf\tv0.0.2\th1:djAvcM5neg9Ush+zR6QXB+VMJzR6TdnX766HPIg1JmI=\n\tdep\tgithub.com/dustin/go-humanize\tv1.0.1\th1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=\n\tdep\tgithub.com/dylibso/observe-sdk/go\tv0.0.0-20240819160327-2d926c5d788a\th1:UwSIFv5g5lIvbGgtf3tVwC7Ky9rmMFBp0RMs+6f6YqE=\n\tdep\tgithub.com/elastic/elastic-transport-go/v8\tv8.6.0\th1:Y2S/FBjx1LlCv5m6pWAF2kDJAHoSjSRSJCApolgfthA=\n\tdep\tgithub.com/elastic/go-elasticsearch/v8\tv8.15.0\th1:IZyJhe7t7WI3NEFdcHnf6IJXqpRf+8S8QWLtZYYyBYk=\n\tdep\tgithub.com/elastic/gosigar\tv0.14.2\n\t=>\tgithub.com/matrixorigin/gosigar\tv0.14.3-0.20241204071856-40aab500bfac\th1:KRPOwOcSZRfWT7w8mr7BmFLoFB75ljgqjkg47xkN/Pc=\n\t\n\tdep\tgithub.com/extism/go-sdk\tv1.6.0\th1:crFRMhjcPAn6R9M4eIvkjHQs7CLBs3yzPqwnj+uwzdg=\n\tdep\tgithub.com/fagongzi/goetty/v2\tv2.0.3-0.20230628075727-26c9a2fd5fb8\n\t=>\tgithub.com/matrixorigin/goetty/v2\tv2.0.0-20260811155919-8edc32ac370a\th1:D8kXjySDJHA8nyZzzi/4cx3KB6qrSPQeugUCLkgoEho=\n\t\n\tdep\tgithub.com/fagongzi/util\tv0.0.0-20210923134909-bccc37b5040d\th1:1pILVCatHj3eVo9i52dZyY4BwjTmSIeN+/hoJh8rD0Y=\n\tdep\tgithub.com/felixge/fgprof\tv0.9.6-0.20240831122612-49987e680f04\th1:6exK5FZYMJwsXo4xGqax5rdCHCYeQz+zgTO+Sk+tNHE=\n\tdep\tgithub.com/getsentry/sentry-go\tv0.12.0\th1:era7g0re5iY13bHSdN/xMkyV+5zZppjRVQhZrXCaEIk=\n\tdep\tgithub.com/go-ini/ini\tv1.67.0\th1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=\n\tdep\tgithub.com/go-logr/logr\tv1.4.3\th1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\n\tdep\tgithub.com/go-logr/stdr\tv1.2.2\th1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\n\tdep\tgithub.com/go-sql-driver/mysql\tv1.9.3\th1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=\n\tdep\tgithub.com/go-viper/mapstructure/v2\tv2.5.0\th1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro=\n\tdep\tgithub.com/gobwas/glob\tv0.2.3\th1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=\n\tdep\tgithub.com/goccy/go-json\tv0.10.6\th1:p8HrPJzOakx/mn/bQtjgNjdTcN+/S6FcG2CTtQOrHVU=\n\tdep\tgithub.com/godbus/dbus/v5\tv5.2.2\th1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ=\n\tdep\tgithub.com/gogo/protobuf\tv1.3.2\th1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\n\tdep\tgithub.com/golang-collections/collections\tv0.0.0-20130729185459-604e922904d3\th1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4=\n\tdep\tgithub.com/golang/geo\tv0.0.0-20260526120156-e21b7802b0ee\th1:L0DB+dB7f2E+BvC518GbeU+WgELvWXTrbFiitwnFtuc=\n\tdep\tgithub.com/golang/glog\tv1.2.5\th1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I=\n\tdep\tgithub.com/golang/snappy\tv1.0.0\th1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=\n\tdep\tgithub.com/google/btree\tv1.1.3\th1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=\n\tdep\tgithub.com/google/flatbuffers\tv25.12.19+incompatible\th1:haMV2JRRJCe1998HeW/p0X9UaMTK6SDo0ffLn2+DbLs=\n\tdep\tgithub.com/google/go-querystring\tv1.1.0\th1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=\n\tdep\tgithub.com/google/pprof\tv0.0.0-20260302011040-a15ffb7f9dcc\th1:VBbFa1lDYWEeV5FZKUiYKYT0VxCp9twUmmaq9eb8sXw=\n\tdep\tgithub.com/google/shlex\tv0.0.0-20191202100458-e7afc7fbc510\th1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=\n\tdep\tgithub.com/google/uuid\tv1.6.0\th1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\n\tdep\tgithub.com/hamba/avro/v2\tv2.31.0\th1:wv3nmua7lCEIwWsb6vqsTS3pXktTxcKg5eoyNu0VhrU=\n\tdep\tgithub.com/hashicorp/errwrap\tv1.1.0\th1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\n\tdep\tgithub.com/hashicorp/go-immutable-radix\tv1.3.1\th1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\n\tdep\tgithub.com/hashicorp/go-msgpack\tv0.5.3\th1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\n\tdep\tgithub.com/hashicorp/go-multierror\tv1.1.1\th1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\n\tdep\tgithub.com/hashicorp/go-sockaddr\tv1.0.0\th1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=\n\tdep\tgithub.com/hashicorp/go-uuid\tv1.0.3\th1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\n\tdep\tgithub.com/hashicorp/golang-lru\tv1.0.2\th1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\n\tdep\tgithub.com/hashicorp/memberlist\tv0.3.1\n\t=>\tgithub.com/matrixorigin/memberlist\tv0.5.1-0.20230322082342-95015c95ee76\th1:MpmqMPooJ0Ea7W4ldIGbQV4D3z+sEiCu6C6aTibiwiQ=\n\t\n\tdep\tgithub.com/hayageek/threadsafe\tv1.0.1\th1:QTMJrninAaGQE7+CYdJWPzTlnhcBPwhxD5GDdvIf5oU=\n\tdep\tgithub.com/ianlancetaylor/demangle\tv0.0.0-20250417193237-f615e6bd150b\th1:ogbOPx86mIhFy764gGkqnkFC8m5PJA7sPzlk9ppLVQA=\n\tdep\tgithub.com/itchyny/gojq\tv0.12.16\th1:yLfgLxhIr/6sJNVmYfQjTIv0jGctu6/DgDoivmxTr7g=\n\tdep\tgithub.com/itchyny/timefmt-go\tv0.1.6\th1:ia3s54iciXDdzWzwaVKXZPbiXzxxnv1SPGFfM/myJ5Q=\n\tdep\tgithub.com/jackc/pgpassfile\tv1.0.0\th1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=\n\tdep\tgithub.com/jackc/pgservicefile\tv0.0.0-20221227161230-091c0ba34f0a\th1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=\n\tdep\tgithub.com/jackc/pgx/v5\tv5.5.5\th1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw=\n\tdep\tgithub.com/jackc/puddle/v2\tv2.2.1\th1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=\n\tdep\tgithub.com/jcmturner/aescts/v2\tv2.0.0\th1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8=\n\tdep\tgithub.com/jcmturner/dnsutils/v2\tv2.0.0\th1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo=\n\tdep\tgithub.com/jcmturner/gofork\tv1.7.6\th1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg=\n\tdep\tgithub.com/jcmturner/goidentity/v6\tv6.0.1\th1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o=\n\tdep\tgithub.com/jcmturner/gokrb5/v8\tv8.4.4\th1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8=\n\tdep\tgithub.com/jcmturner/rpc/v2\tv2.0.3\th1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY=\n\tdep\tgithub.com/jmespath/go-jmespath\tv0.4.0\th1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=\n\tdep\tgithub.com/jonboulle/clockwork\tv0.4.0\th1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=\n\tdep\tgithub.com/josharian/native\tv1.1.0\th1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=\n\tdep\tgithub.com/json-iterator/go\tv1.1.12\th1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\n\tdep\tgithub.com/kamstrup/intmap\tv0.5.2\th1:qnwBm1mh4XAnW9W9Ue9tZtTff8pS6+s6iKF6JRIV2Dk=\n\tdep\tgithub.com/klauspost/compress\tv1.19.0\th1:sXLILfc9jV2QYWkzFOPWStmcUVH2RHEB1JCdY2oVvCQ=\n\tdep\tgithub.com/klauspost/cpuid/v2\tv2.4.0\th1:S6Hrbc7+ywsr0r+RLapfGBHfyefhCTwEh3A0tV913Dw=\n\tdep\tgithub.com/klauspost/crc32\tv1.3.0\th1:sSmTt3gUt81RP655XGZPElI0PelVTZ6YwCRnPSupoFM=\n\tdep\tgithub.com/kr/pretty\tv0.3.1\th1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\n\tdep\tgithub.com/kr/text\tv0.2.0\th1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\n\tdep\tgithub.com/lmittmann/tint\tv1.1.3\th1:Hv4EaHWXQr+GTFnOU4VKf8UvAtZgn0VuKT+G0wFlO3I=\n\tdep\tgithub.com/lni/dragonboat/v4\tv4.0.0-20220815145555-6f622e8bcbef\n\t=>\tgithub.com/matrixorigin/dragonboat/v4\tv4.0.0-20261006150417-abc3d2fce5a6\th1:AQWG/u9fUQvn7WTGRvjV9CkHyNI8mCxpr8qZf3vRAmg=\n\t\n\tdep\tgithub.com/lni/goutils\tv1.3.1-0.20220604063047-388d67b4dbc4\n\t=>\tgithub.com/matrixorigin/goutils\tv1.3.1-0.20220604063047-388d67b4dbc4\th1:+SmZP2bG+YcO/ntzjCleCu6hFTJiue7Oj2tftpJKTlU=\n\t\n\tdep\tgithub.com/lni/vfs\tv0.2.1-0.20220616104132-8852fd867376\n\t=>\tgithub.com/matrixorigin/vfs\tv0.2.1-0.20220616104132-8852fd867376\th1:1XpEh8nPx1yFTeTFMj/aMipEiilDhQToQS8gjEU2HxM=\n\t\n\tdep\tgithub.com/matrixorigin/mysql\tv1.8.2-0.20241106110439-6ac9ee94770d\th1:27vD3JGbrFmaQtDYQT/W1jFFr0xvipdwH5R4bZPGQdE=\n\tdep\tgithub.com/matrixorigin/simdcsv\tv0.0.0-20230210060146-09b8e45209dd\th1:DvqhuH3kOpsE6vXZA5WEaRNAUUUcf44S1p5VInbjdfU=\n\tdep\tgithub.com/mattn/go-isatty\tv0.0.21\th1:xYae+lCNBP7QuW4PUnNG61ffM4hVIfm+zUzDuSzYLGs=\n\tdep\tgithub.com/mdlayher/netlink\tv1.7.2\th1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g=\n\tdep\tgithub.com/mdlayher/socket\tv0.5.1\th1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=\n\tdep\tgithub.com/miekg/dns\tv1.1.53\th1:ZBkuHr5dxHtB1caEOlZTLPo7D3L3TWckgUUs/RHfDxw=\n\tdep\tgithub.com/minio/crc64nvme\tv1.1.1\th1:8dwx/Pz49suywbO+auHCBpCtlW1OfpcLN7wYgVR6wAI=\n\tdep\tgithub.com/minio/md5-simd\tv1.1.2\th1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=\n\tdep\tgithub.com/minio/minio-go/v7\tv7.0.99\th1:2vH/byrwUkIpFQFOilvTfaUpvAX3fEFhEzO+DR3DlCE=\n\tdep\tgithub.com/mitchellh/mapstructure\tv1.5.0\th1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\n\tdep\tgithub.com/moby/sys/userns\tv0.1.0\th1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=\n\tdep\tgithub.com/modern-go/concurrent\tv0.0.0-20180306012644-bacd9c7ef1dd\th1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\n\tdep\tgithub.com/modern-go/reflect2\tv1.0.3-0.20250322232337-35a7c28c31ee\th1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8=\n\tdep\tgithub.com/mohae/deepcopy\tv0.0.0-20170929034955-c48cc78d4826\th1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=\n\tdep\tgithub.com/mozillazg/go-httpheader\tv0.2.1\th1:geV7TrjbL8KXSyvghnFm+NyTux/hxwueTSrwhe88TQQ=\n\tdep\tgithub.com/mschoch/smat\tv0.2.0\th1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM=\n\tdep\tgithub.com/munnerz/goautoneg\tv0.0.0-20191010083416-a7dc8b61c822\th1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\n\tdep\tgithub.com/ncruces/go-dns\tv1.2.5\th1:d2zZVWUassOyUOc8okB70hXBZrupqkuls7C7ZXMaKMM=\n\tdep\tgithub.com/openacid/slimarray\tv0.1.3\th1:+/+G8k+Nz4p8QUj4J2kd7IzFC5DiJzk5H2QPp/BpHHk=\n\tdep\tgithub.com/opencontainers/runtime-spec\tv1.3.0\th1:YZupQUdctfhpZy3TM39nN9Ika5CBWT5diQ8ibYCRkxg=\n\tdep\tgithub.com/opentracing/opentracing-go\tv1.2.1-0.20220228012449-10b1cf09e00b\th1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A=\n\tdep\tgithub.com/panjf2000/ants/v2\tv2.12.0\th1:u9JhESo83i/GkZnhfTNuFMMWcNt7mnV1bGJ6FT4wXH8=\n\tdep\tgithub.com/parquet-go/parquet-go\tv0.25.1\th1:l7jJwNM0xrk0cnIIptWMtnSnuxRkwq53S+Po3KG8Xgo=\n\tdep\tgithub.com/pbnjay/memory\tv0.0.0-20210728143218-7b4eea64cf58\th1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0=\n\tdep\tgithub.com/petermattis/goid\tv0.0.0-20260330135022-df67b199bc81\th1:WDsQxOJDy0N1VRAjXLpi8sCEZRSGarLWQevDxpTBRrM=\n\tdep\tgithub.com/philhofer/fwd\tv1.2.0\th1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM=\n\tdep\tgithub.com/pierrec/lz4/v4\tv4.1.27\th1:+PhzhWDrjRj89TH2sw43nE3+4+W8lSxIuQadEHZyjUk=\n\tdep\tgithub.com/pkg/errors\tv0.9.1\th1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\n\tdep\tgithub.com/pkoukk/tiktoken-go\tv0.1.6\th1:JF0TlJzhTbrI30wCvFuiw6FzP2+/bR+FIxUdgEAcUsw=\n\tdep\tgithub.com/planetscale/vtprotobuf\tv0.6.1-0.20250313105119-ba97887b0a25\th1:S1hI5JiKP7883xBzZAr1ydcxrKNSVNm7+3+JwjxZEsg=\n\tdep\tgithub.com/plar/go-adaptive-radix-tree\tv1.0.5\th1:rHR89qy/6c24TBAHullFMrJsU9hGlKmPibdBGU6/gbM=\n\tdep\tgithub.com/pmezard/go-difflib\tv1.0.1-0.20181226105442-5d4384ee4fb2\th1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\n\tdep\tgithub.com/prometheus/client_golang\tv1.23.2\th1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=\n\tdep\tgithub.com/prometheus/client_model\tv0.6.2\th1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=\n\tdep\tgithub.com/prometheus/common\tv0.67.5\th1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4=\n\tdep\tgithub.com/prometheus/procfs\tv0.20.1\th1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc=\n\tdep\tgithub.com/robfig/cron/v3\tv3.0.1\th1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=\n\tdep\tgithub.com/rogpeppe/go-internal\tv1.14.1\th1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=\n\tdep\tgithub.com/rs/xid\tv1.6.0\th1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=\n\tdep\tgithub.com/samber/lo\tv1.38.1\th1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=\n\tdep\tgithub.com/sean-/seed\tv0.0.0-20170313163322-e2103e2c3529\th1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\n\tdep\tgithub.com/segmentio/asm\tv1.1.3\th1:WM03sfUOENvvKexOLp+pCqgb/WDjsi7EK8gIsICtzhc=\n\tdep\tgithub.com/segmentio/encoding\tv0.4.0\th1:MEBYvRqiUB2nfR2criEXWqwdY6HJOUrCn5hboVOVmy8=\n\tdep\tgithub.com/shirou/gopsutil/v3\tv3.23.12\th1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4=\n\tdep\tgithub.com/sirupsen/logrus\tv1.9.4\th1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=\n\tdep\tgithub.com/spf13/cobra\tv1.10.2\th1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=\n\tdep\tgithub.com/spf13/pflag\tv1.0.10\th1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=\n\tdep\tgithub.com/spkg/bom\tv1.0.0\th1:S939THe0ukL5WcTGiGqkgtaW5JW+O6ITaIlpJXTYY64=\n\tdep\tgithub.com/stretchr/testify\tv1.11.1\th1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\n\tdep\tgithub.com/substrait-io/substrait-protobuf/go\tv0.85.0\th1:zk6MtNWLtDSl8a7qCZRFH0+EIIXVrrd/hsgYK/SQTgM=\n\tdep\tgithub.com/tencentyun/cos-go-sdk-v5\tv0.7.55\th1:9DfH3umWUd0I2jdqcUxrU1kLfUPOydULNy4T9qN5PF8=\n\tdep\tgithub.com/tetratelabs/wabin\tv0.0.0-20230304001439-f6f874872834\th1:ZF+QBjOI+tILZjBaFj3HgFonKXUcwgJ4djLb6i42S3Q=\n\tdep\tgithub.com/tetratelabs/wazero\tv1.8.1-0.20240916092830-1353ca24fef0\th1:NCRnJ+X6eZt3awiReoHCcDuC6Wf+CgWk6p4IDkIuxTo=\n\tdep\tgithub.com/ti-mo/conntrack\tv0.5.1\th1:opEwkFICnDbQc0BUXl73PHBK0h23jEIFVjXsqvF4GY0=\n\tdep\tgithub.com/ti-mo/netfilter\tv0.5.2\th1:CTjOwFuNNeZ9QPdRXt1MZFLFUf84cKtiQutNauHWd40=\n\tdep\tgithub.com/tidwall/btree\tv1.7.0\th1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI=\n\tdep\tgithub.com/tidwall/pretty\tv1.2.1\th1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\n\tdep\tgithub.com/tinylib/msgp\tv1.6.4\th1:mOwYbyYDLPj35mkA2BjjYejgJk9BuHxDdvRnb6v2ZcQ=\n\tdep\tgithub.com/tklauser/go-sysconf\tv0.3.16\th1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA=\n\tdep\tgithub.com/tklauser/numcpus\tv0.11.0\th1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw=\n\tdep\tgithub.com/tmc/langchaingo\tv0.1.13\th1:rcpMWBIi2y3B90XxfE4Ao8dhCQPVDMaNPnN5cGB1CaA=\n\tdep\tgithub.com/twmb/franz-go\tv1.21.6\th1:+v0dQJVIIuw9uPmPWmPrkoUHs1pPeV8MSwA4eU/Y2kY=\n\tdep\tgithub.com/twmb/franz-go/pkg/kadm\tv1.18.0\th1:WRf/LZmDdcDXwX7WMbtDU++v+b3NzYh2bCGoPMmzirw=\n\tdep\tgithub.com/twmb/franz-go/pkg/kmsg\tv1.13.1\th1:fG5kItwysTk5UXqVwb64EpQEy3TydF3vYYK21nUQ+bI=\n\tdep\tgithub.com/uber/h3-go/v4\tv4.5.0\th1:7ruJoHCtYOCyihXfQRsPb4o6CfkhCBtVeZFM7+z1kww=\n\tdep\tgithub.com/unum-cloud/usearch/golang\tv0.0.0-20260524141737-9fd6b0115dcd\th1:y37IxTSOZw3uSbMJ1gJse5x9Mcrzto6d6iWkb3NnZxs=\n\tdep\tgithub.com/valyala/fastrand\tv1.1.0\th1:f+5HkLW4rsgzdNoleUOB69hyT9IlD2ZQh9GyDMfb5G8=\n\tdep\tgithub.com/valyala/histogram\tv1.2.0\th1:wyYGAZZt3CpwUiIb9AU/Zbllg1llXyrtApRS815OLoQ=\n\tdep\tgithub.com/xdg-go/scram\tv1.2.0\th1:bYKF2AEwG5rqd1BumT4gAnvwU/M9nBp2pTSxeZw7Wvs=\n\tdep\tgithub.com/xdg-go/stringprep\tv1.0.4\th1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=\n\tdep\tgithub.com/xeipuuv/gojsonpointer\tv0.0.0-20190905194746-02993c407bfb\th1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=\n\tdep\tgithub.com/xeipuuv/gojsonreference\tv0.0.0-20180127040603-bd5ef7bd5415\th1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=\n\tdep\tgithub.com/xeipuuv/gojsonschema\tv1.2.0\th1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=\n\tdep\tgithub.com/yalue/onnxruntime_go\tv1.31.0\th1:1ln4YW1SFOFfGJZXe3jNOb2JUSt+l2pEneZfV8HdtFA=\n\tdep\tgithub.com/yanyiwu/gojieba\tv1.4.7\th1:2YkXELcYLTE0SJetq6xv4MjpEikWga6VpFn4jIFFQ/k=\n\tdep\tgithub.com/youmark/pkcs8\tv0.0.0-20240726163527-a2c0da244d78\th1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=\n\tdep\tgithub.com/zeebo/xxh3\tv1.1.0\th1:s7DLGDK45Dyfg7++yxI0khrfwq9661w9EN78eP/UZVs=\n\tdep\tgo.mongodb.org/mongo-driver/v2\tv2.8.0\th1:CxWDGQYY8QQwNjAl/aq2sfWakdnWZynnqJ9F4DhHbP8=\n\tdep\tgo.opentelemetry.io/auto/sdk\tv1.2.1\th1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=\n\tdep\tgo.opentelemetry.io/otel\tv1.43.0\th1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=\n\tdep\tgo.opentelemetry.io/otel/metric\tv1.43.0\th1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=\n\tdep\tgo.opentelemetry.io/otel/trace\tv1.43.0\th1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=\n\tdep\tgo.opentelemetry.io/proto/otlp\tv1.10.0\th1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g=\n\tdep\tgo.starlark.net\tv0.0.0-20250701195324-d457b4515e0e\th1:/WX+ZvcgVJxdIxVR9J3u45ds+Bl4IWPIHRSSICp0t3Q=\n\tdep\tgo.uber.org/automaxprocs\tv1.5.3\th1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=\n\tdep\tgo.uber.org/multierr\tv1.11.0\th1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\n\tdep\tgo.uber.org/ratelimit\tv0.2.0\th1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA=\n\tdep\tgo.uber.org/zap\tv1.27.1\th1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=\n\tdep\tgo.yaml.in/yaml/v2\tv2.4.4\th1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=\n\tdep\tgo.yaml.in/yaml/v3\tv3.0.4\th1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=\n\tdep\tgolang.org/x/crypto\tv0.51.0\th1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI=\n\tdep\tgolang.org/x/exp\tv0.0.0-20260410095643-746e56fc9e2f\th1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM=\n\tdep\tgolang.org/x/net\tv0.55.0\th1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=\n\tdep\tgolang.org/x/sync\tv0.22.0\th1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek=\n\tdep\tgolang.org/x/sys\tv0.47.0\th1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=\n\tdep\tgolang.org/x/text\tv0.37.0\th1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=\n\tdep\tgolang.org/x/time\tv0.15.0\th1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=\n\tdep\tgonum.org/v1/gonum\tv0.17.0\th1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=\n\tdep\tgoogle.golang.org/genproto/googleapis/rpc\tv0.0.0-20260414002931-afd174a4e478\th1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw=\n\tdep\tgoogle.golang.org/grpc\tv1.82.0\th1:vguDnZUPjE26w09A63VoxZPnvPjB5Riyc0mkXPFmAIU=\n\tdep\tgoogle.golang.org/protobuf\tv1.36.11\th1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=\n\tdep\tgopkg.in/ini.v1\tv1.67.1\th1:tVBILHy0R6e4wkYOn3XmiITt/hEVH4TFMYvAX2Ytz6k=\n\tdep\tgopkg.in/natefinch/lumberjack.v2\tv2.2.1\th1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\n\tdep\tgopkg.in/yaml.v3\tv3.0.1\th1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\n\tdep\tvitess.io/vitess\tv0.24.0\th1:1beFkQ3hbozQv0pmuicu1LL22szH7yVwZR/fofGiXxk=\n\tbuild\t-buildmode=exe\n\tbuild\t-compiler=gc\n\tbuild\t-ldflags=\"-extldflags '-L/workspace/matrixone-mv-pr/cgo -lmo -L/workspace/matrixone-mv-pr/thirdparties/install/lib -lusearch_c -lroaring -fopenmp -Wl,-rpath,/workspace/matrixone-mv-pr/cgo -Wl,-rpath,/workspace/matrixone-mv-pr/thirdparties/install/lib'\"\n\tbuild\tCGO_ENABLED=1\n\tbuild\tCGO_CFLAGS=\"-I/workspace/matrixone-mv-pr/cgo -I/workspace/matrixone-mv-pr/thirdparties/install/include\"\n\tbuild\tCGO_CPPFLAGS=\n\tbuild\tCGO_CXXFLAGS=\n\tbuild\tCGO_LDFLAGS=-L/workspace/matrixone-mv-pr/thirdparties/install/lib\n\tbuild\tGOARCH=amd64\n\tbuild\tGOOS=linux\n\tbuild\tGOAMD64=v1\n\tbuild\tvcs=git\n\tbuild\tvcs.revision=9f873692e0efa869c64c4d1c84e212c5a8a3272a\n\tbuild\tvcs.time=2026-10-16T08:28:01Z\n\tbuild\tvcs.modified=false\n" + }, + "protocols": { + "collation": 117, + "materialized_views": 118 + }, + "new_build_identity": "pre-delivery cd5de147 plus vcs.modified=true; not a pristine publication build", + "tagged_vcs": "/tmp/mo-service-mv-protocol118: go1.27.1\n\tpath\tgithub.com/matrixorigin/matrixone/cmd/mo-service\n\tmod\tgithub.com/matrixorigin/matrixone\tv0.0.0-20261016075419-cd5de147d504+dirty\t\n\tdep\tfilippo.io/edwards25519\tv1.1.1\th1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw=\n\tdep\tgithub.com/BurntSushi/toml\tv1.2.1\th1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=\n\tdep\tgithub.com/DataDog/zstd\tv1.5.0\th1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo=\n\tdep\tgithub.com/FastFilter/xorfilter\tv0.5.1\th1:UjtPttI1SnKWUmeQKu8Y+4ZvMJv7KP6/NZTsGBPQY08=\n\tdep\tgithub.com/KimMachineGun/automemlimit\tv0.6.0\th1:p/BXkH+K40Hax+PuWWPQ478hPjsp9h1CPDhLlA3Z37E=\n\tdep\tgithub.com/Masterminds/semver/v3\tv3.2.1\th1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=\n\tdep\tgithub.com/RoaringBitmap/roaring/v2\tv2.16.0\th1:Kys1UNf49d5W8Tq3bpuAhIr/Z8/yPB+59CO8A6c/BbE=\n\tdep\tgithub.com/VictoriaMetrics/metrics\tv1.18.1\th1:OZ0+kTTto8oPfHnVAnTOoyl0XlRhRkoQrD2n2cOuRw0=\n\tdep\tgithub.com/alibabacloud-go/debug\tv1.0.1\th1:MsW9SmUtbb1Fnt3ieC6NNZi6aEwrXfDksD4QA6GSbPg=\n\tdep\tgithub.com/alibabacloud-go/tea\tv1.2.2\th1:aTsR6Rl3ANWPfqeQugPglfurloyBJY85eFy7Gc1+8oU=\n\tdep\tgithub.com/aliyun/alibaba-cloud-sdk-go\tv1.63.34\th1:eZM2MHY/p4TFO1pGf9O5HiuYE59hwrrkf3HvCtkL5Ok=\n\tdep\tgithub.com/aliyun/aliyun-oss-go-sdk\tv3.0.2+incompatible\th1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g=\n\tdep\tgithub.com/aliyun/credentials-go\tv1.3.10\th1:45Xxrae/evfzQL9V10zL3xX31eqgLWEaIdCoPipOEQA=\n\tdep\tgithub.com/andres-erbsen/clock\tv0.0.0-20160526145045-9e14626cd129\th1:MzBOUgng9orim59UnfUTLRjMpd09C5uEVQ6RPGeCaVI=\n\tdep\tgithub.com/andybalholm/brotli\tv1.2.2\th1:HzTuoo2ErYQqf5qvcJInB8uvqSVxRttzkFexPWtnceM=\n\tdep\tgithub.com/apache/arrow-go/v18\tv18.7.0\th1:Vw/i+cJyebUofT7JlqFpe65LrmwxULn166jjwStM4HY=\n\tdep\tgithub.com/armon/go-metrics\tv0.4.1\th1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\n\tdep\tgithub.com/aws/aws-sdk-go\tv1.55.5\th1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=\n\tdep\tgithub.com/aws/aws-sdk-go-v2\tv1.41.5\th1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/aws/protocol/eventstream\tv1.7.8\th1:eBMB84YGghSocM7PsjmmPffTa+1FBUeNvGvFou6V/4o=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/config\tv1.32.14\th1:opVIRo/ZbbI8OIqSOKmpFaY7IwfFUOCCXBsUpJOwDdI=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/credentials\tv1.19.14\th1:n+UcGWAIZHkXzYt87uMFBv/l8THYELoX6gVcUvgl6fI=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/feature/ec2/imds\tv1.18.21\th1:NUS3K4BTDArQqNu2ih7yeDLaS3bmHD0YndtA6UP884g=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/configsources\tv1.4.21\th1:Rgg6wvjjtX8bNHcvi9OnXWwcE0a2vGpbwmtICOsvcf4=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/endpoints/v2\tv2.7.21\th1:PEgGVtPoB6NTpPrBgqSE5hE/o47Ij9qk/SEZFbUOe9A=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/ini\tv1.8.6\th1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/v4a\tv1.4.22\th1:rWyie/PxDRIdhNf4DzRk0lvjVOqFJuNnO8WwaIRVxzQ=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/accept-encoding\tv1.13.7\th1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/checksum\tv1.9.13\th1:JRaIgADQS/U6uXDqlPiefP32yXTda7Kqfx+LgspooZM=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/presigned-url\tv1.13.21\th1:c31//R3xgIJMSC8S6hEVq+38DcvUlgFY0FM6mSI5oto=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/s3shared\tv1.19.21\th1:ZlvrNcHSFFWURB8avufQq9gFsheUgjVD9536obIknfM=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/s3\tv1.99.0\th1:hlSuz394kV0vhv9drL5lhuEFbEOEP1VyQpy15qWh1Pk=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/signin\tv1.0.9\th1:QKZH0S178gCmFEgst8hN0mCX1KxLgHBKKY/CLqwP8lg=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/sso\tv1.30.15\th1:lFd1+ZSEYJZYvv9d6kXzhkZu07si3f+GQ1AaYwa2LUM=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/ssooidc\tv1.35.19\th1:dzztQ1YmfPrxdrOiuZRMF6fuOwWlWpD2StNLTceKpys=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/sts\tv1.41.10\th1:p8ogvvLugcR/zLBXTXrTkj0RYBUdErbMnAFFp12Lm/U=\n\tdep\tgithub.com/aws/smithy-go\tv1.24.3\th1:XgOAaUgx+HhVBoP4v8n6HCQoTRDhoMghKqw4LNHsDNg=\n\tdep\tgithub.com/axiomhq/hyperloglog\tv0.2.6\th1:sRhvvF3RIXWQgAXaTphLp4yJiX4S0IN3MWTaAgZoRJw=\n\tdep\tgithub.com/beorn7/perks\tv1.0.1\th1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\n\tdep\tgithub.com/bits-and-blooms/bitset\tv1.24.2\th1:M7/NzVbsytmtfHbumG+K2bremQPMJuqv1JD3vOaFxp0=\n\tdep\tgithub.com/blevesearch/mmap-go\tv1.2.0\th1:l33nNKPFcBjJUMwem6sAYJPUzhUCABoK9FxZDGiFNBI=\n\tdep\tgithub.com/blevesearch/vellum\tv1.2.0\th1:xkDiOEsHc2t3Cp0NsNZZ36pvc130sCzcGKOPMzXe+e0=\n\tdep\tgithub.com/buger/jsonparser\tv1.1.2\th1:frqHqw7otoVbk5M8LlE/L7HTnIq2v9RX6EJ48i9AxJk=\n\tdep\tgithub.com/bytedance/gopkg\tv0.1.3\th1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M=\n\tdep\tgithub.com/bytedance/sonic\tv1.15.2\th1:90H+rcF/FwLXwfB1cudOLq/je83n683Utf4Cbp0xHCo=\n\tdep\tgithub.com/cespare/xxhash/v2\tv2.3.0\th1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\n\tdep\tgithub.com/cilium/ebpf\tv0.21.0\th1:4dpx1J/B/1apeTmWBH5BkVLayHTkFrMovVPnHEk+l3k=\n\tdep\tgithub.com/clbanning/mxj\tv1.8.4\th1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I=\n\tdep\tgithub.com/clipperhouse/uax29/v2\tv2.7.0\th1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk=\n\tdep\tgithub.com/cockroachdb/errors\tv1.9.1\th1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8=\n\tdep\tgithub.com/cockroachdb/logtags\tv0.0.0-20230118201751-21c54148d20b\th1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=\n\tdep\tgithub.com/cockroachdb/pebble\tv0.0.0-20220407171941-2120d145e292\th1:7fLxcRpQTdi1iic0cIUpK+hKKLM5XdPhEbWRRrxfvLU=\n\tdep\tgithub.com/cockroachdb/redact\tv1.1.3\th1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ=\n\tdep\tgithub.com/colinmarc/hdfs/v2\tv2.4.0\th1:v6R8oBx/Wu9fHpdPoJJjpGSUxo8NhHIwrwsfhFvU9W0=\n\tdep\tgithub.com/containerd/cgroups/v3\tv3.1.3\th1:eUNflyMddm18+yrDmZPn3jI7C5hJ9ahABE5q6dyLYXQ=\n\tdep\tgithub.com/containerd/log\tv0.1.0\th1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=\n\tdep\tgithub.com/coreos/go-systemd/v22\tv22.7.0\th1:LAEzFkke61DFROc7zNLX/WA2i5J8gYqe0rSj9KI28KA=\n\tdep\tgithub.com/cpegeric/pdftotext-go\tv0.0.0-20241112123704-49cb86a3790e\th1:tQSCiEjYPRU+AuuVR+zd+xYVOsEqX1clPhmIAM6FCHU=\n\tdep\tgithub.com/davecgh/go-spew\tv1.1.2-0.20180830191138-d8f796af33cc\th1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\n\tdep\tgithub.com/detailyang/go-fallocate\tv0.0.0-20180908115635-432fa640bd2e\th1:lj77EKYUpYXTd8CD/+QMIf8b6OIOTsfEBSXiAzuEHTU=\n\tdep\tgithub.com/dgryski/go-metro\tv0.0.0-20250106013310-edb8663e5e33\th1:ucRHb6/lvW/+mTEIGbvhcYU3S8+uSNkuMjx/qZFfhtM=\n\tdep\tgithub.com/dlclark/regexp2\tv1.10.0\n\t=>\tgithub.com/XuPeng-SH/regexp2\tv1.10.1-0.20261004024751-718f43e031fe\th1:7TlZYr/D2KQlZ2lwGehHN7Ix3ICj43OXaZx2UT4DOIo=\n\t\n\tdep\tgithub.com/docker/go-units\tv0.5.0\th1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=\n\tdep\tgithub.com/dolthub/maphash\tv0.1.0\th1:bsQ7JsF4FkkWyrP3oCnFJgrCUAFbFf3kOl4L/QxPDyQ=\n\tdep\tgithub.com/dslipak/pdf\tv0.0.2\th1:djAvcM5neg9Ush+zR6QXB+VMJzR6TdnX766HPIg1JmI=\n\tdep\tgithub.com/dustin/go-humanize\tv1.0.1\th1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=\n\tdep\tgithub.com/dylibso/observe-sdk/go\tv0.0.0-20240819160327-2d926c5d788a\th1:UwSIFv5g5lIvbGgtf3tVwC7Ky9rmMFBp0RMs+6f6YqE=\n\tdep\tgithub.com/elastic/elastic-transport-go/v8\tv8.6.0\th1:Y2S/FBjx1LlCv5m6pWAF2kDJAHoSjSRSJCApolgfthA=\n\tdep\tgithub.com/elastic/go-elasticsearch/v8\tv8.15.0\th1:IZyJhe7t7WI3NEFdcHnf6IJXqpRf+8S8QWLtZYYyBYk=\n\tdep\tgithub.com/elastic/gosigar\tv0.14.2\n\t=>\tgithub.com/matrixorigin/gosigar\tv0.14.3-0.20241204071856-40aab500bfac\th1:KRPOwOcSZRfWT7w8mr7BmFLoFB75ljgqjkg47xkN/Pc=\n\t\n\tdep\tgithub.com/extism/go-sdk\tv1.6.0\th1:crFRMhjcPAn6R9M4eIvkjHQs7CLBs3yzPqwnj+uwzdg=\n\tdep\tgithub.com/fagongzi/goetty/v2\tv2.0.3-0.20230628075727-26c9a2fd5fb8\n\t=>\tgithub.com/matrixorigin/goetty/v2\tv2.0.0-20260811155919-8edc32ac370a\th1:D8kXjySDJHA8nyZzzi/4cx3KB6qrSPQeugUCLkgoEho=\n\t\n\tdep\tgithub.com/fagongzi/util\tv0.0.0-20210923134909-bccc37b5040d\th1:1pILVCatHj3eVo9i52dZyY4BwjTmSIeN+/hoJh8rD0Y=\n\tdep\tgithub.com/felixge/fgprof\tv0.9.6-0.20240831122612-49987e680f04\th1:6exK5FZYMJwsXo4xGqax5rdCHCYeQz+zgTO+Sk+tNHE=\n\tdep\tgithub.com/getsentry/sentry-go\tv0.12.0\th1:era7g0re5iY13bHSdN/xMkyV+5zZppjRVQhZrXCaEIk=\n\tdep\tgithub.com/go-ini/ini\tv1.67.0\th1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=\n\tdep\tgithub.com/go-logr/logr\tv1.4.3\th1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\n\tdep\tgithub.com/go-logr/stdr\tv1.2.2\th1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\n\tdep\tgithub.com/go-sql-driver/mysql\tv1.9.3\th1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=\n\tdep\tgithub.com/go-viper/mapstructure/v2\tv2.5.0\th1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro=\n\tdep\tgithub.com/gobwas/glob\tv0.2.3\th1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=\n\tdep\tgithub.com/goccy/go-json\tv0.10.6\th1:p8HrPJzOakx/mn/bQtjgNjdTcN+/S6FcG2CTtQOrHVU=\n\tdep\tgithub.com/godbus/dbus/v5\tv5.2.2\th1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ=\n\tdep\tgithub.com/gogo/protobuf\tv1.3.2\th1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\n\tdep\tgithub.com/golang-collections/collections\tv0.0.0-20130729185459-604e922904d3\th1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4=\n\tdep\tgithub.com/golang/geo\tv0.0.0-20260526120156-e21b7802b0ee\th1:L0DB+dB7f2E+BvC518GbeU+WgELvWXTrbFiitwnFtuc=\n\tdep\tgithub.com/golang/glog\tv1.2.5\th1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I=\n\tdep\tgithub.com/golang/snappy\tv1.0.0\th1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=\n\tdep\tgithub.com/google/btree\tv1.1.3\th1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=\n\tdep\tgithub.com/google/flatbuffers\tv25.12.19+incompatible\th1:haMV2JRRJCe1998HeW/p0X9UaMTK6SDo0ffLn2+DbLs=\n\tdep\tgithub.com/google/go-querystring\tv1.1.0\th1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=\n\tdep\tgithub.com/google/pprof\tv0.0.0-20260302011040-a15ffb7f9dcc\th1:VBbFa1lDYWEeV5FZKUiYKYT0VxCp9twUmmaq9eb8sXw=\n\tdep\tgithub.com/google/shlex\tv0.0.0-20191202100458-e7afc7fbc510\th1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=\n\tdep\tgithub.com/google/uuid\tv1.6.0\th1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\n\tdep\tgithub.com/hamba/avro/v2\tv2.31.0\th1:wv3nmua7lCEIwWsb6vqsTS3pXktTxcKg5eoyNu0VhrU=\n\tdep\tgithub.com/hashicorp/errwrap\tv1.1.0\th1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\n\tdep\tgithub.com/hashicorp/go-immutable-radix\tv1.3.1\th1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\n\tdep\tgithub.com/hashicorp/go-msgpack\tv0.5.3\th1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\n\tdep\tgithub.com/hashicorp/go-multierror\tv1.1.1\th1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\n\tdep\tgithub.com/hashicorp/go-sockaddr\tv1.0.0\th1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=\n\tdep\tgithub.com/hashicorp/go-uuid\tv1.0.3\th1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\n\tdep\tgithub.com/hashicorp/golang-lru\tv1.0.2\th1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\n\tdep\tgithub.com/hashicorp/memberlist\tv0.3.1\n\t=>\tgithub.com/matrixorigin/memberlist\tv0.5.1-0.20230322082342-95015c95ee76\th1:MpmqMPooJ0Ea7W4ldIGbQV4D3z+sEiCu6C6aTibiwiQ=\n\t\n\tdep\tgithub.com/hayageek/threadsafe\tv1.0.1\th1:QTMJrninAaGQE7+CYdJWPzTlnhcBPwhxD5GDdvIf5oU=\n\tdep\tgithub.com/ianlancetaylor/demangle\tv0.0.0-20250417193237-f615e6bd150b\th1:ogbOPx86mIhFy764gGkqnkFC8m5PJA7sPzlk9ppLVQA=\n\tdep\tgithub.com/itchyny/gojq\tv0.12.16\th1:yLfgLxhIr/6sJNVmYfQjTIv0jGctu6/DgDoivmxTr7g=\n\tdep\tgithub.com/itchyny/timefmt-go\tv0.1.6\th1:ia3s54iciXDdzWzwaVKXZPbiXzxxnv1SPGFfM/myJ5Q=\n\tdep\tgithub.com/jackc/pgpassfile\tv1.0.0\th1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=\n\tdep\tgithub.com/jackc/pgservicefile\tv0.0.0-20221227161230-091c0ba34f0a\th1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=\n\tdep\tgithub.com/jackc/pgx/v5\tv5.5.5\th1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw=\n\tdep\tgithub.com/jackc/puddle/v2\tv2.2.1\th1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=\n\tdep\tgithub.com/jcmturner/aescts/v2\tv2.0.0\th1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8=\n\tdep\tgithub.com/jcmturner/dnsutils/v2\tv2.0.0\th1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo=\n\tdep\tgithub.com/jcmturner/gofork\tv1.7.6\th1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg=\n\tdep\tgithub.com/jcmturner/goidentity/v6\tv6.0.1\th1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o=\n\tdep\tgithub.com/jcmturner/gokrb5/v8\tv8.4.4\th1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8=\n\tdep\tgithub.com/jcmturner/rpc/v2\tv2.0.3\th1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY=\n\tdep\tgithub.com/jmespath/go-jmespath\tv0.4.0\th1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=\n\tdep\tgithub.com/jonboulle/clockwork\tv0.4.0\th1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=\n\tdep\tgithub.com/josharian/native\tv1.1.0\th1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=\n\tdep\tgithub.com/json-iterator/go\tv1.1.12\th1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\n\tdep\tgithub.com/kamstrup/intmap\tv0.5.2\th1:qnwBm1mh4XAnW9W9Ue9tZtTff8pS6+s6iKF6JRIV2Dk=\n\tdep\tgithub.com/klauspost/compress\tv1.19.0\th1:sXLILfc9jV2QYWkzFOPWStmcUVH2RHEB1JCdY2oVvCQ=\n\tdep\tgithub.com/klauspost/cpuid/v2\tv2.4.0\th1:S6Hrbc7+ywsr0r+RLapfGBHfyefhCTwEh3A0tV913Dw=\n\tdep\tgithub.com/klauspost/crc32\tv1.3.0\th1:sSmTt3gUt81RP655XGZPElI0PelVTZ6YwCRnPSupoFM=\n\tdep\tgithub.com/kr/pretty\tv0.3.1\th1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\n\tdep\tgithub.com/kr/text\tv0.2.0\th1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\n\tdep\tgithub.com/lmittmann/tint\tv1.1.3\th1:Hv4EaHWXQr+GTFnOU4VKf8UvAtZgn0VuKT+G0wFlO3I=\n\tdep\tgithub.com/lni/dragonboat/v4\tv4.0.0-20220815145555-6f622e8bcbef\n\t=>\tgithub.com/matrixorigin/dragonboat/v4\tv4.0.0-20261006150417-abc3d2fce5a6\th1:AQWG/u9fUQvn7WTGRvjV9CkHyNI8mCxpr8qZf3vRAmg=\n\t\n\tdep\tgithub.com/lni/goutils\tv1.3.1-0.20220604063047-388d67b4dbc4\n\t=>\tgithub.com/matrixorigin/goutils\tv1.3.1-0.20220604063047-388d67b4dbc4\th1:+SmZP2bG+YcO/ntzjCleCu6hFTJiue7Oj2tftpJKTlU=\n\t\n\tdep\tgithub.com/lni/vfs\tv0.2.1-0.20220616104132-8852fd867376\n\t=>\tgithub.com/matrixorigin/vfs\tv0.2.1-0.20220616104132-8852fd867376\th1:1XpEh8nPx1yFTeTFMj/aMipEiilDhQToQS8gjEU2HxM=\n\t\n\tdep\tgithub.com/matrixorigin/mysql\tv1.8.2-0.20241106110439-6ac9ee94770d\th1:27vD3JGbrFmaQtDYQT/W1jFFr0xvipdwH5R4bZPGQdE=\n\tdep\tgithub.com/matrixorigin/simdcsv\tv0.0.0-20230210060146-09b8e45209dd\th1:DvqhuH3kOpsE6vXZA5WEaRNAUUUcf44S1p5VInbjdfU=\n\tdep\tgithub.com/mattn/go-isatty\tv0.0.21\th1:xYae+lCNBP7QuW4PUnNG61ffM4hVIfm+zUzDuSzYLGs=\n\tdep\tgithub.com/mdlayher/netlink\tv1.7.2\th1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g=\n\tdep\tgithub.com/mdlayher/socket\tv0.5.1\th1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=\n\tdep\tgithub.com/miekg/dns\tv1.1.53\th1:ZBkuHr5dxHtB1caEOlZTLPo7D3L3TWckgUUs/RHfDxw=\n\tdep\tgithub.com/minio/crc64nvme\tv1.1.1\th1:8dwx/Pz49suywbO+auHCBpCtlW1OfpcLN7wYgVR6wAI=\n\tdep\tgithub.com/minio/md5-simd\tv1.1.2\th1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=\n\tdep\tgithub.com/minio/minio-go/v7\tv7.0.99\th1:2vH/byrwUkIpFQFOilvTfaUpvAX3fEFhEzO+DR3DlCE=\n\tdep\tgithub.com/mitchellh/mapstructure\tv1.5.0\th1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\n\tdep\tgithub.com/moby/sys/userns\tv0.1.0\th1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=\n\tdep\tgithub.com/modern-go/concurrent\tv0.0.0-20180306012644-bacd9c7ef1dd\th1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\n\tdep\tgithub.com/modern-go/reflect2\tv1.0.3-0.20250322232337-35a7c28c31ee\th1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8=\n\tdep\tgithub.com/mohae/deepcopy\tv0.0.0-20170929034955-c48cc78d4826\th1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=\n\tdep\tgithub.com/mozillazg/go-httpheader\tv0.2.1\th1:geV7TrjbL8KXSyvghnFm+NyTux/hxwueTSrwhe88TQQ=\n\tdep\tgithub.com/mschoch/smat\tv0.2.0\th1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM=\n\tdep\tgithub.com/munnerz/goautoneg\tv0.0.0-20191010083416-a7dc8b61c822\th1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\n\tdep\tgithub.com/ncruces/go-dns\tv1.2.5\th1:d2zZVWUassOyUOc8okB70hXBZrupqkuls7C7ZXMaKMM=\n\tdep\tgithub.com/openacid/slimarray\tv0.1.3\th1:+/+G8k+Nz4p8QUj4J2kd7IzFC5DiJzk5H2QPp/BpHHk=\n\tdep\tgithub.com/opencontainers/runtime-spec\tv1.3.0\th1:YZupQUdctfhpZy3TM39nN9Ika5CBWT5diQ8ibYCRkxg=\n\tdep\tgithub.com/opentracing/opentracing-go\tv1.2.1-0.20220228012449-10b1cf09e00b\th1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A=\n\tdep\tgithub.com/panjf2000/ants/v2\tv2.12.0\th1:u9JhESo83i/GkZnhfTNuFMMWcNt7mnV1bGJ6FT4wXH8=\n\tdep\tgithub.com/parquet-go/parquet-go\tv0.25.1\th1:l7jJwNM0xrk0cnIIptWMtnSnuxRkwq53S+Po3KG8Xgo=\n\tdep\tgithub.com/pbnjay/memory\tv0.0.0-20210728143218-7b4eea64cf58\th1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0=\n\tdep\tgithub.com/petermattis/goid\tv0.0.0-20260330135022-df67b199bc81\th1:WDsQxOJDy0N1VRAjXLpi8sCEZRSGarLWQevDxpTBRrM=\n\tdep\tgithub.com/philhofer/fwd\tv1.2.0\th1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM=\n\tdep\tgithub.com/pierrec/lz4/v4\tv4.1.27\th1:+PhzhWDrjRj89TH2sw43nE3+4+W8lSxIuQadEHZyjUk=\n\tdep\tgithub.com/pkg/errors\tv0.9.1\th1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\n\tdep\tgithub.com/pkoukk/tiktoken-go\tv0.1.6\th1:JF0TlJzhTbrI30wCvFuiw6FzP2+/bR+FIxUdgEAcUsw=\n\tdep\tgithub.com/planetscale/vtprotobuf\tv0.6.1-0.20250313105119-ba97887b0a25\th1:S1hI5JiKP7883xBzZAr1ydcxrKNSVNm7+3+JwjxZEsg=\n\tdep\tgithub.com/plar/go-adaptive-radix-tree\tv1.0.5\th1:rHR89qy/6c24TBAHullFMrJsU9hGlKmPibdBGU6/gbM=\n\tdep\tgithub.com/pmezard/go-difflib\tv1.0.1-0.20181226105442-5d4384ee4fb2\th1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\n\tdep\tgithub.com/prometheus/client_golang\tv1.23.2\th1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=\n\tdep\tgithub.com/prometheus/client_model\tv0.6.2\th1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=\n\tdep\tgithub.com/prometheus/common\tv0.67.5\th1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4=\n\tdep\tgithub.com/prometheus/procfs\tv0.20.1\th1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc=\n\tdep\tgithub.com/robfig/cron/v3\tv3.0.1\th1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=\n\tdep\tgithub.com/rogpeppe/go-internal\tv1.14.1\th1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=\n\tdep\tgithub.com/rs/xid\tv1.6.0\th1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=\n\tdep\tgithub.com/samber/lo\tv1.38.1\th1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=\n\tdep\tgithub.com/sean-/seed\tv0.0.0-20170313163322-e2103e2c3529\th1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\n\tdep\tgithub.com/segmentio/asm\tv1.1.3\th1:WM03sfUOENvvKexOLp+pCqgb/WDjsi7EK8gIsICtzhc=\n\tdep\tgithub.com/segmentio/encoding\tv0.4.0\th1:MEBYvRqiUB2nfR2criEXWqwdY6HJOUrCn5hboVOVmy8=\n\tdep\tgithub.com/shirou/gopsutil/v3\tv3.23.12\th1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4=\n\tdep\tgithub.com/sirupsen/logrus\tv1.9.4\th1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=\n\tdep\tgithub.com/spf13/cobra\tv1.10.2\th1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=\n\tdep\tgithub.com/spf13/pflag\tv1.0.10\th1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=\n\tdep\tgithub.com/spkg/bom\tv1.0.0\th1:S939THe0ukL5WcTGiGqkgtaW5JW+O6ITaIlpJXTYY64=\n\tdep\tgithub.com/stretchr/testify\tv1.11.1\th1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\n\tdep\tgithub.com/substrait-io/substrait-protobuf/go\tv0.85.0\th1:zk6MtNWLtDSl8a7qCZRFH0+EIIXVrrd/hsgYK/SQTgM=\n\tdep\tgithub.com/tencentyun/cos-go-sdk-v5\tv0.7.55\th1:9DfH3umWUd0I2jdqcUxrU1kLfUPOydULNy4T9qN5PF8=\n\tdep\tgithub.com/tetratelabs/wabin\tv0.0.0-20230304001439-f6f874872834\th1:ZF+QBjOI+tILZjBaFj3HgFonKXUcwgJ4djLb6i42S3Q=\n\tdep\tgithub.com/tetratelabs/wazero\tv1.8.1-0.20240916092830-1353ca24fef0\th1:NCRnJ+X6eZt3awiReoHCcDuC6Wf+CgWk6p4IDkIuxTo=\n\tdep\tgithub.com/ti-mo/conntrack\tv0.5.1\th1:opEwkFICnDbQc0BUXl73PHBK0h23jEIFVjXsqvF4GY0=\n\tdep\tgithub.com/ti-mo/netfilter\tv0.5.2\th1:CTjOwFuNNeZ9QPdRXt1MZFLFUf84cKtiQutNauHWd40=\n\tdep\tgithub.com/tidwall/btree\tv1.7.0\th1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI=\n\tdep\tgithub.com/tidwall/pretty\tv1.2.1\th1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\n\tdep\tgithub.com/tinylib/msgp\tv1.6.4\th1:mOwYbyYDLPj35mkA2BjjYejgJk9BuHxDdvRnb6v2ZcQ=\n\tdep\tgithub.com/tklauser/go-sysconf\tv0.3.16\th1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA=\n\tdep\tgithub.com/tklauser/numcpus\tv0.11.0\th1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw=\n\tdep\tgithub.com/tmc/langchaingo\tv0.1.13\th1:rcpMWBIi2y3B90XxfE4Ao8dhCQPVDMaNPnN5cGB1CaA=\n\tdep\tgithub.com/twmb/franz-go\tv1.21.6\th1:+v0dQJVIIuw9uPmPWmPrkoUHs1pPeV8MSwA4eU/Y2kY=\n\tdep\tgithub.com/twmb/franz-go/pkg/kadm\tv1.18.0\th1:WRf/LZmDdcDXwX7WMbtDU++v+b3NzYh2bCGoPMmzirw=\n\tdep\tgithub.com/twmb/franz-go/pkg/kmsg\tv1.13.1\th1:fG5kItwysTk5UXqVwb64EpQEy3TydF3vYYK21nUQ+bI=\n\tdep\tgithub.com/uber/h3-go/v4\tv4.5.0\th1:7ruJoHCtYOCyihXfQRsPb4o6CfkhCBtVeZFM7+z1kww=\n\tdep\tgithub.com/unum-cloud/usearch/golang\tv0.0.0-20260524141737-9fd6b0115dcd\th1:y37IxTSOZw3uSbMJ1gJse5x9Mcrzto6d6iWkb3NnZxs=\n\tdep\tgithub.com/valyala/fastrand\tv1.1.0\th1:f+5HkLW4rsgzdNoleUOB69hyT9IlD2ZQh9GyDMfb5G8=\n\tdep\tgithub.com/valyala/histogram\tv1.2.0\th1:wyYGAZZt3CpwUiIb9AU/Zbllg1llXyrtApRS815OLoQ=\n\tdep\tgithub.com/xdg-go/scram\tv1.2.0\th1:bYKF2AEwG5rqd1BumT4gAnvwU/M9nBp2pTSxeZw7Wvs=\n\tdep\tgithub.com/xdg-go/stringprep\tv1.0.4\th1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=\n\tdep\tgithub.com/xeipuuv/gojsonpointer\tv0.0.0-20190905194746-02993c407bfb\th1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=\n\tdep\tgithub.com/xeipuuv/gojsonreference\tv0.0.0-20180127040603-bd5ef7bd5415\th1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=\n\tdep\tgithub.com/xeipuuv/gojsonschema\tv1.2.0\th1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=\n\tdep\tgithub.com/yalue/onnxruntime_go\tv1.31.0\th1:1ln4YW1SFOFfGJZXe3jNOb2JUSt+l2pEneZfV8HdtFA=\n\tdep\tgithub.com/yanyiwu/gojieba\tv1.4.7\th1:2YkXELcYLTE0SJetq6xv4MjpEikWga6VpFn4jIFFQ/k=\n\tdep\tgithub.com/youmark/pkcs8\tv0.0.0-20240726163527-a2c0da244d78\th1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=\n\tdep\tgithub.com/zeebo/xxh3\tv1.1.0\th1:s7DLGDK45Dyfg7++yxI0khrfwq9661w9EN78eP/UZVs=\n\tdep\tgo.mongodb.org/mongo-driver/v2\tv2.8.0\th1:CxWDGQYY8QQwNjAl/aq2sfWakdnWZynnqJ9F4DhHbP8=\n\tdep\tgo.opentelemetry.io/auto/sdk\tv1.2.1\th1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=\n\tdep\tgo.opentelemetry.io/otel\tv1.43.0\th1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=\n\tdep\tgo.opentelemetry.io/otel/metric\tv1.43.0\th1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=\n\tdep\tgo.opentelemetry.io/otel/trace\tv1.43.0\th1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=\n\tdep\tgo.opentelemetry.io/proto/otlp\tv1.10.0\th1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g=\n\tdep\tgo.starlark.net\tv0.0.0-20250701195324-d457b4515e0e\th1:/WX+ZvcgVJxdIxVR9J3u45ds+Bl4IWPIHRSSICp0t3Q=\n\tdep\tgo.uber.org/automaxprocs\tv1.5.3\th1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=\n\tdep\tgo.uber.org/multierr\tv1.11.0\th1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\n\tdep\tgo.uber.org/ratelimit\tv0.2.0\th1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA=\n\tdep\tgo.uber.org/zap\tv1.27.1\th1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=\n\tdep\tgo.yaml.in/yaml/v2\tv2.4.4\th1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=\n\tdep\tgo.yaml.in/yaml/v3\tv3.0.4\th1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=\n\tdep\tgolang.org/x/crypto\tv0.51.0\th1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI=\n\tdep\tgolang.org/x/exp\tv0.0.0-20260410095643-746e56fc9e2f\th1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM=\n\tdep\tgolang.org/x/net\tv0.55.0\th1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=\n\tdep\tgolang.org/x/sync\tv0.22.0\th1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek=\n\tdep\tgolang.org/x/sys\tv0.47.0\th1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=\n\tdep\tgolang.org/x/text\tv0.37.0\th1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=\n\tdep\tgolang.org/x/time\tv0.15.0\th1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=\n\tdep\tgonum.org/v1/gonum\tv0.17.0\th1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=\n\tdep\tgoogle.golang.org/genproto/googleapis/rpc\tv0.0.0-20260414002931-afd174a4e478\th1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw=\n\tdep\tgoogle.golang.org/grpc\tv1.82.0\th1:vguDnZUPjE26w09A63VoxZPnvPjB5Riyc0mkXPFmAIU=\n\tdep\tgoogle.golang.org/protobuf\tv1.36.11\th1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=\n\tdep\tgopkg.in/ini.v1\tv1.67.1\th1:tVBILHy0R6e4wkYOn3XmiITt/hEVH4TFMYvAX2Ytz6k=\n\tdep\tgopkg.in/natefinch/lumberjack.v2\tv2.2.1\th1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\n\tdep\tgopkg.in/yaml.v3\tv3.0.1\th1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\n\tdep\tvitess.io/vitess\tv0.24.0\th1:1beFkQ3hbozQv0pmuicu1LL22szH7yVwZR/fofGiXxk=\n\tbuild\t-buildmode=exe\n\tbuild\t-compiler=gc\n\tbuild\t-ldflags=\"-extldflags '-L/workspace/matrixone-mv-pr/cgo -lmo -L/workspace/matrixone-mv-pr/thirdparties/install/lib -lusearch_c -lroaring -fopenmp -Wl,-rpath,/workspace/matrixone-mv-pr/cgo -Wl,-rpath,/workspace/matrixone-mv-pr/thirdparties/install/lib'\"\n\tbuild\t-tags=matrixone_mv_faults\n\tbuild\tCGO_ENABLED=1\n\tbuild\tCGO_CFLAGS=\"-I/workspace/matrixone-mv-pr/cgo -I/workspace/matrixone-mv-pr/thirdparties/install/include\"\n\tbuild\tCGO_CPPFLAGS=\n\tbuild\tCGO_CXXFLAGS=\n\tbuild\tCGO_LDFLAGS=-L/workspace/matrixone-mv-pr/thirdparties/install/lib\n\tbuild\tGOARCH=amd64\n\tbuild\tGOOS=linux\n\tbuild\tGOAMD64=v1\n\tbuild\tvcs=git\n\tbuild\tvcs.revision=cd5de147d5043ff1795bfb430714afcc9019f144\n\tbuild\tvcs.time=2026-10-16T07:54:19Z\n\tbuild\tvcs.modified=true\n", + "production_vcs": "/tmp/mo-service-mv-protocol118-production: go1.27.1\n\tpath\tgithub.com/matrixorigin/matrixone/cmd/mo-service\n\tmod\tgithub.com/matrixorigin/matrixone\tv0.0.0-20261016075419-cd5de147d504+dirty\t\n\tdep\tfilippo.io/edwards25519\tv1.1.1\th1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw=\n\tdep\tgithub.com/BurntSushi/toml\tv1.2.1\th1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=\n\tdep\tgithub.com/DataDog/zstd\tv1.5.0\th1:+K/VEwIAaPcHiMtQvpLD4lqW7f0Gk3xdYZmI1hD+CXo=\n\tdep\tgithub.com/FastFilter/xorfilter\tv0.5.1\th1:UjtPttI1SnKWUmeQKu8Y+4ZvMJv7KP6/NZTsGBPQY08=\n\tdep\tgithub.com/KimMachineGun/automemlimit\tv0.6.0\th1:p/BXkH+K40Hax+PuWWPQ478hPjsp9h1CPDhLlA3Z37E=\n\tdep\tgithub.com/Masterminds/semver/v3\tv3.2.1\th1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=\n\tdep\tgithub.com/RoaringBitmap/roaring/v2\tv2.16.0\th1:Kys1UNf49d5W8Tq3bpuAhIr/Z8/yPB+59CO8A6c/BbE=\n\tdep\tgithub.com/VictoriaMetrics/metrics\tv1.18.1\th1:OZ0+kTTto8oPfHnVAnTOoyl0XlRhRkoQrD2n2cOuRw0=\n\tdep\tgithub.com/alibabacloud-go/debug\tv1.0.1\th1:MsW9SmUtbb1Fnt3ieC6NNZi6aEwrXfDksD4QA6GSbPg=\n\tdep\tgithub.com/alibabacloud-go/tea\tv1.2.2\th1:aTsR6Rl3ANWPfqeQugPglfurloyBJY85eFy7Gc1+8oU=\n\tdep\tgithub.com/aliyun/alibaba-cloud-sdk-go\tv1.63.34\th1:eZM2MHY/p4TFO1pGf9O5HiuYE59hwrrkf3HvCtkL5Ok=\n\tdep\tgithub.com/aliyun/aliyun-oss-go-sdk\tv3.0.2+incompatible\th1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g=\n\tdep\tgithub.com/aliyun/credentials-go\tv1.3.10\th1:45Xxrae/evfzQL9V10zL3xX31eqgLWEaIdCoPipOEQA=\n\tdep\tgithub.com/andres-erbsen/clock\tv0.0.0-20160526145045-9e14626cd129\th1:MzBOUgng9orim59UnfUTLRjMpd09C5uEVQ6RPGeCaVI=\n\tdep\tgithub.com/andybalholm/brotli\tv1.2.2\th1:HzTuoo2ErYQqf5qvcJInB8uvqSVxRttzkFexPWtnceM=\n\tdep\tgithub.com/apache/arrow-go/v18\tv18.7.0\th1:Vw/i+cJyebUofT7JlqFpe65LrmwxULn166jjwStM4HY=\n\tdep\tgithub.com/armon/go-metrics\tv0.4.1\th1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=\n\tdep\tgithub.com/aws/aws-sdk-go\tv1.55.5\th1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=\n\tdep\tgithub.com/aws/aws-sdk-go-v2\tv1.41.5\th1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/aws/protocol/eventstream\tv1.7.8\th1:eBMB84YGghSocM7PsjmmPffTa+1FBUeNvGvFou6V/4o=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/config\tv1.32.14\th1:opVIRo/ZbbI8OIqSOKmpFaY7IwfFUOCCXBsUpJOwDdI=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/credentials\tv1.19.14\th1:n+UcGWAIZHkXzYt87uMFBv/l8THYELoX6gVcUvgl6fI=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/feature/ec2/imds\tv1.18.21\th1:NUS3K4BTDArQqNu2ih7yeDLaS3bmHD0YndtA6UP884g=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/configsources\tv1.4.21\th1:Rgg6wvjjtX8bNHcvi9OnXWwcE0a2vGpbwmtICOsvcf4=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/endpoints/v2\tv2.7.21\th1:PEgGVtPoB6NTpPrBgqSE5hE/o47Ij9qk/SEZFbUOe9A=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/ini\tv1.8.6\th1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/internal/v4a\tv1.4.22\th1:rWyie/PxDRIdhNf4DzRk0lvjVOqFJuNnO8WwaIRVxzQ=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/accept-encoding\tv1.13.7\th1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/checksum\tv1.9.13\th1:JRaIgADQS/U6uXDqlPiefP32yXTda7Kqfx+LgspooZM=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/presigned-url\tv1.13.21\th1:c31//R3xgIJMSC8S6hEVq+38DcvUlgFY0FM6mSI5oto=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/internal/s3shared\tv1.19.21\th1:ZlvrNcHSFFWURB8avufQq9gFsheUgjVD9536obIknfM=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/s3\tv1.99.0\th1:hlSuz394kV0vhv9drL5lhuEFbEOEP1VyQpy15qWh1Pk=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/signin\tv1.0.9\th1:QKZH0S178gCmFEgst8hN0mCX1KxLgHBKKY/CLqwP8lg=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/sso\tv1.30.15\th1:lFd1+ZSEYJZYvv9d6kXzhkZu07si3f+GQ1AaYwa2LUM=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/ssooidc\tv1.35.19\th1:dzztQ1YmfPrxdrOiuZRMF6fuOwWlWpD2StNLTceKpys=\n\tdep\tgithub.com/aws/aws-sdk-go-v2/service/sts\tv1.41.10\th1:p8ogvvLugcR/zLBXTXrTkj0RYBUdErbMnAFFp12Lm/U=\n\tdep\tgithub.com/aws/smithy-go\tv1.24.3\th1:XgOAaUgx+HhVBoP4v8n6HCQoTRDhoMghKqw4LNHsDNg=\n\tdep\tgithub.com/axiomhq/hyperloglog\tv0.2.6\th1:sRhvvF3RIXWQgAXaTphLp4yJiX4S0IN3MWTaAgZoRJw=\n\tdep\tgithub.com/beorn7/perks\tv1.0.1\th1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\n\tdep\tgithub.com/bits-and-blooms/bitset\tv1.24.2\th1:M7/NzVbsytmtfHbumG+K2bremQPMJuqv1JD3vOaFxp0=\n\tdep\tgithub.com/blevesearch/mmap-go\tv1.2.0\th1:l33nNKPFcBjJUMwem6sAYJPUzhUCABoK9FxZDGiFNBI=\n\tdep\tgithub.com/blevesearch/vellum\tv1.2.0\th1:xkDiOEsHc2t3Cp0NsNZZ36pvc130sCzcGKOPMzXe+e0=\n\tdep\tgithub.com/buger/jsonparser\tv1.1.2\th1:frqHqw7otoVbk5M8LlE/L7HTnIq2v9RX6EJ48i9AxJk=\n\tdep\tgithub.com/bytedance/gopkg\tv0.1.3\th1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M=\n\tdep\tgithub.com/bytedance/sonic\tv1.15.2\th1:90H+rcF/FwLXwfB1cudOLq/je83n683Utf4Cbp0xHCo=\n\tdep\tgithub.com/cespare/xxhash/v2\tv2.3.0\th1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\n\tdep\tgithub.com/cilium/ebpf\tv0.21.0\th1:4dpx1J/B/1apeTmWBH5BkVLayHTkFrMovVPnHEk+l3k=\n\tdep\tgithub.com/clbanning/mxj\tv1.8.4\th1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I=\n\tdep\tgithub.com/clipperhouse/uax29/v2\tv2.7.0\th1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk=\n\tdep\tgithub.com/cockroachdb/errors\tv1.9.1\th1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8=\n\tdep\tgithub.com/cockroachdb/logtags\tv0.0.0-20230118201751-21c54148d20b\th1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=\n\tdep\tgithub.com/cockroachdb/pebble\tv0.0.0-20220407171941-2120d145e292\th1:7fLxcRpQTdi1iic0cIUpK+hKKLM5XdPhEbWRRrxfvLU=\n\tdep\tgithub.com/cockroachdb/redact\tv1.1.3\th1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ=\n\tdep\tgithub.com/colinmarc/hdfs/v2\tv2.4.0\th1:v6R8oBx/Wu9fHpdPoJJjpGSUxo8NhHIwrwsfhFvU9W0=\n\tdep\tgithub.com/containerd/cgroups/v3\tv3.1.3\th1:eUNflyMddm18+yrDmZPn3jI7C5hJ9ahABE5q6dyLYXQ=\n\tdep\tgithub.com/containerd/log\tv0.1.0\th1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=\n\tdep\tgithub.com/coreos/go-systemd/v22\tv22.7.0\th1:LAEzFkke61DFROc7zNLX/WA2i5J8gYqe0rSj9KI28KA=\n\tdep\tgithub.com/cpegeric/pdftotext-go\tv0.0.0-20241112123704-49cb86a3790e\th1:tQSCiEjYPRU+AuuVR+zd+xYVOsEqX1clPhmIAM6FCHU=\n\tdep\tgithub.com/davecgh/go-spew\tv1.1.2-0.20180830191138-d8f796af33cc\th1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\n\tdep\tgithub.com/detailyang/go-fallocate\tv0.0.0-20180908115635-432fa640bd2e\th1:lj77EKYUpYXTd8CD/+QMIf8b6OIOTsfEBSXiAzuEHTU=\n\tdep\tgithub.com/dgryski/go-metro\tv0.0.0-20250106013310-edb8663e5e33\th1:ucRHb6/lvW/+mTEIGbvhcYU3S8+uSNkuMjx/qZFfhtM=\n\tdep\tgithub.com/dlclark/regexp2\tv1.10.0\n\t=>\tgithub.com/XuPeng-SH/regexp2\tv1.10.1-0.20261004024751-718f43e031fe\th1:7TlZYr/D2KQlZ2lwGehHN7Ix3ICj43OXaZx2UT4DOIo=\n\t\n\tdep\tgithub.com/docker/go-units\tv0.5.0\th1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=\n\tdep\tgithub.com/dolthub/maphash\tv0.1.0\th1:bsQ7JsF4FkkWyrP3oCnFJgrCUAFbFf3kOl4L/QxPDyQ=\n\tdep\tgithub.com/dslipak/pdf\tv0.0.2\th1:djAvcM5neg9Ush+zR6QXB+VMJzR6TdnX766HPIg1JmI=\n\tdep\tgithub.com/dustin/go-humanize\tv1.0.1\th1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=\n\tdep\tgithub.com/dylibso/observe-sdk/go\tv0.0.0-20240819160327-2d926c5d788a\th1:UwSIFv5g5lIvbGgtf3tVwC7Ky9rmMFBp0RMs+6f6YqE=\n\tdep\tgithub.com/elastic/elastic-transport-go/v8\tv8.6.0\th1:Y2S/FBjx1LlCv5m6pWAF2kDJAHoSjSRSJCApolgfthA=\n\tdep\tgithub.com/elastic/go-elasticsearch/v8\tv8.15.0\th1:IZyJhe7t7WI3NEFdcHnf6IJXqpRf+8S8QWLtZYYyBYk=\n\tdep\tgithub.com/elastic/gosigar\tv0.14.2\n\t=>\tgithub.com/matrixorigin/gosigar\tv0.14.3-0.20241204071856-40aab500bfac\th1:KRPOwOcSZRfWT7w8mr7BmFLoFB75ljgqjkg47xkN/Pc=\n\t\n\tdep\tgithub.com/extism/go-sdk\tv1.6.0\th1:crFRMhjcPAn6R9M4eIvkjHQs7CLBs3yzPqwnj+uwzdg=\n\tdep\tgithub.com/fagongzi/goetty/v2\tv2.0.3-0.20230628075727-26c9a2fd5fb8\n\t=>\tgithub.com/matrixorigin/goetty/v2\tv2.0.0-20260811155919-8edc32ac370a\th1:D8kXjySDJHA8nyZzzi/4cx3KB6qrSPQeugUCLkgoEho=\n\t\n\tdep\tgithub.com/fagongzi/util\tv0.0.0-20210923134909-bccc37b5040d\th1:1pILVCatHj3eVo9i52dZyY4BwjTmSIeN+/hoJh8rD0Y=\n\tdep\tgithub.com/felixge/fgprof\tv0.9.6-0.20240831122612-49987e680f04\th1:6exK5FZYMJwsXo4xGqax5rdCHCYeQz+zgTO+Sk+tNHE=\n\tdep\tgithub.com/getsentry/sentry-go\tv0.12.0\th1:era7g0re5iY13bHSdN/xMkyV+5zZppjRVQhZrXCaEIk=\n\tdep\tgithub.com/go-ini/ini\tv1.67.0\th1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=\n\tdep\tgithub.com/go-logr/logr\tv1.4.3\th1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\n\tdep\tgithub.com/go-logr/stdr\tv1.2.2\th1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\n\tdep\tgithub.com/go-sql-driver/mysql\tv1.9.3\th1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=\n\tdep\tgithub.com/go-viper/mapstructure/v2\tv2.5.0\th1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro=\n\tdep\tgithub.com/gobwas/glob\tv0.2.3\th1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=\n\tdep\tgithub.com/goccy/go-json\tv0.10.6\th1:p8HrPJzOakx/mn/bQtjgNjdTcN+/S6FcG2CTtQOrHVU=\n\tdep\tgithub.com/godbus/dbus/v5\tv5.2.2\th1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ=\n\tdep\tgithub.com/gogo/protobuf\tv1.3.2\th1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\n\tdep\tgithub.com/golang-collections/collections\tv0.0.0-20130729185459-604e922904d3\th1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4=\n\tdep\tgithub.com/golang/geo\tv0.0.0-20260526120156-e21b7802b0ee\th1:L0DB+dB7f2E+BvC518GbeU+WgELvWXTrbFiitwnFtuc=\n\tdep\tgithub.com/golang/glog\tv1.2.5\th1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I=\n\tdep\tgithub.com/golang/snappy\tv1.0.0\th1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=\n\tdep\tgithub.com/google/btree\tv1.1.3\th1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=\n\tdep\tgithub.com/google/flatbuffers\tv25.12.19+incompatible\th1:haMV2JRRJCe1998HeW/p0X9UaMTK6SDo0ffLn2+DbLs=\n\tdep\tgithub.com/google/go-querystring\tv1.1.0\th1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=\n\tdep\tgithub.com/google/pprof\tv0.0.0-20260302011040-a15ffb7f9dcc\th1:VBbFa1lDYWEeV5FZKUiYKYT0VxCp9twUmmaq9eb8sXw=\n\tdep\tgithub.com/google/shlex\tv0.0.0-20191202100458-e7afc7fbc510\th1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=\n\tdep\tgithub.com/google/uuid\tv1.6.0\th1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\n\tdep\tgithub.com/hamba/avro/v2\tv2.31.0\th1:wv3nmua7lCEIwWsb6vqsTS3pXktTxcKg5eoyNu0VhrU=\n\tdep\tgithub.com/hashicorp/errwrap\tv1.1.0\th1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\n\tdep\tgithub.com/hashicorp/go-immutable-radix\tv1.3.1\th1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=\n\tdep\tgithub.com/hashicorp/go-msgpack\tv0.5.3\th1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=\n\tdep\tgithub.com/hashicorp/go-multierror\tv1.1.1\th1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\n\tdep\tgithub.com/hashicorp/go-sockaddr\tv1.0.0\th1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs=\n\tdep\tgithub.com/hashicorp/go-uuid\tv1.0.3\th1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=\n\tdep\tgithub.com/hashicorp/golang-lru\tv1.0.2\th1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=\n\tdep\tgithub.com/hashicorp/memberlist\tv0.3.1\n\t=>\tgithub.com/matrixorigin/memberlist\tv0.5.1-0.20230322082342-95015c95ee76\th1:MpmqMPooJ0Ea7W4ldIGbQV4D3z+sEiCu6C6aTibiwiQ=\n\t\n\tdep\tgithub.com/hayageek/threadsafe\tv1.0.1\th1:QTMJrninAaGQE7+CYdJWPzTlnhcBPwhxD5GDdvIf5oU=\n\tdep\tgithub.com/ianlancetaylor/demangle\tv0.0.0-20250417193237-f615e6bd150b\th1:ogbOPx86mIhFy764gGkqnkFC8m5PJA7sPzlk9ppLVQA=\n\tdep\tgithub.com/itchyny/gojq\tv0.12.16\th1:yLfgLxhIr/6sJNVmYfQjTIv0jGctu6/DgDoivmxTr7g=\n\tdep\tgithub.com/itchyny/timefmt-go\tv0.1.6\th1:ia3s54iciXDdzWzwaVKXZPbiXzxxnv1SPGFfM/myJ5Q=\n\tdep\tgithub.com/jackc/pgpassfile\tv1.0.0\th1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=\n\tdep\tgithub.com/jackc/pgservicefile\tv0.0.0-20221227161230-091c0ba34f0a\th1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=\n\tdep\tgithub.com/jackc/pgx/v5\tv5.5.5\th1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw=\n\tdep\tgithub.com/jackc/puddle/v2\tv2.2.1\th1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=\n\tdep\tgithub.com/jcmturner/aescts/v2\tv2.0.0\th1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8=\n\tdep\tgithub.com/jcmturner/dnsutils/v2\tv2.0.0\th1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo=\n\tdep\tgithub.com/jcmturner/gofork\tv1.7.6\th1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg=\n\tdep\tgithub.com/jcmturner/goidentity/v6\tv6.0.1\th1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o=\n\tdep\tgithub.com/jcmturner/gokrb5/v8\tv8.4.4\th1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8=\n\tdep\tgithub.com/jcmturner/rpc/v2\tv2.0.3\th1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY=\n\tdep\tgithub.com/jmespath/go-jmespath\tv0.4.0\th1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=\n\tdep\tgithub.com/jonboulle/clockwork\tv0.4.0\th1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=\n\tdep\tgithub.com/josharian/native\tv1.1.0\th1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=\n\tdep\tgithub.com/json-iterator/go\tv1.1.12\th1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\n\tdep\tgithub.com/kamstrup/intmap\tv0.5.2\th1:qnwBm1mh4XAnW9W9Ue9tZtTff8pS6+s6iKF6JRIV2Dk=\n\tdep\tgithub.com/klauspost/compress\tv1.19.0\th1:sXLILfc9jV2QYWkzFOPWStmcUVH2RHEB1JCdY2oVvCQ=\n\tdep\tgithub.com/klauspost/cpuid/v2\tv2.4.0\th1:S6Hrbc7+ywsr0r+RLapfGBHfyefhCTwEh3A0tV913Dw=\n\tdep\tgithub.com/klauspost/crc32\tv1.3.0\th1:sSmTt3gUt81RP655XGZPElI0PelVTZ6YwCRnPSupoFM=\n\tdep\tgithub.com/kr/pretty\tv0.3.1\th1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\n\tdep\tgithub.com/kr/text\tv0.2.0\th1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\n\tdep\tgithub.com/lmittmann/tint\tv1.1.3\th1:Hv4EaHWXQr+GTFnOU4VKf8UvAtZgn0VuKT+G0wFlO3I=\n\tdep\tgithub.com/lni/dragonboat/v4\tv4.0.0-20220815145555-6f622e8bcbef\n\t=>\tgithub.com/matrixorigin/dragonboat/v4\tv4.0.0-20261006150417-abc3d2fce5a6\th1:AQWG/u9fUQvn7WTGRvjV9CkHyNI8mCxpr8qZf3vRAmg=\n\t\n\tdep\tgithub.com/lni/goutils\tv1.3.1-0.20220604063047-388d67b4dbc4\n\t=>\tgithub.com/matrixorigin/goutils\tv1.3.1-0.20220604063047-388d67b4dbc4\th1:+SmZP2bG+YcO/ntzjCleCu6hFTJiue7Oj2tftpJKTlU=\n\t\n\tdep\tgithub.com/lni/vfs\tv0.2.1-0.20220616104132-8852fd867376\n\t=>\tgithub.com/matrixorigin/vfs\tv0.2.1-0.20220616104132-8852fd867376\th1:1XpEh8nPx1yFTeTFMj/aMipEiilDhQToQS8gjEU2HxM=\n\t\n\tdep\tgithub.com/matrixorigin/mysql\tv1.8.2-0.20241106110439-6ac9ee94770d\th1:27vD3JGbrFmaQtDYQT/W1jFFr0xvipdwH5R4bZPGQdE=\n\tdep\tgithub.com/matrixorigin/simdcsv\tv0.0.0-20230210060146-09b8e45209dd\th1:DvqhuH3kOpsE6vXZA5WEaRNAUUUcf44S1p5VInbjdfU=\n\tdep\tgithub.com/mattn/go-isatty\tv0.0.21\th1:xYae+lCNBP7QuW4PUnNG61ffM4hVIfm+zUzDuSzYLGs=\n\tdep\tgithub.com/mdlayher/netlink\tv1.7.2\th1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g=\n\tdep\tgithub.com/mdlayher/socket\tv0.5.1\th1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=\n\tdep\tgithub.com/miekg/dns\tv1.1.53\th1:ZBkuHr5dxHtB1caEOlZTLPo7D3L3TWckgUUs/RHfDxw=\n\tdep\tgithub.com/minio/crc64nvme\tv1.1.1\th1:8dwx/Pz49suywbO+auHCBpCtlW1OfpcLN7wYgVR6wAI=\n\tdep\tgithub.com/minio/md5-simd\tv1.1.2\th1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=\n\tdep\tgithub.com/minio/minio-go/v7\tv7.0.99\th1:2vH/byrwUkIpFQFOilvTfaUpvAX3fEFhEzO+DR3DlCE=\n\tdep\tgithub.com/mitchellh/mapstructure\tv1.5.0\th1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=\n\tdep\tgithub.com/moby/sys/userns\tv0.1.0\th1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=\n\tdep\tgithub.com/modern-go/concurrent\tv0.0.0-20180306012644-bacd9c7ef1dd\th1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\n\tdep\tgithub.com/modern-go/reflect2\tv1.0.3-0.20250322232337-35a7c28c31ee\th1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8=\n\tdep\tgithub.com/mohae/deepcopy\tv0.0.0-20170929034955-c48cc78d4826\th1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=\n\tdep\tgithub.com/mozillazg/go-httpheader\tv0.2.1\th1:geV7TrjbL8KXSyvghnFm+NyTux/hxwueTSrwhe88TQQ=\n\tdep\tgithub.com/mschoch/smat\tv0.2.0\th1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM=\n\tdep\tgithub.com/munnerz/goautoneg\tv0.0.0-20191010083416-a7dc8b61c822\th1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\n\tdep\tgithub.com/ncruces/go-dns\tv1.2.5\th1:d2zZVWUassOyUOc8okB70hXBZrupqkuls7C7ZXMaKMM=\n\tdep\tgithub.com/openacid/slimarray\tv0.1.3\th1:+/+G8k+Nz4p8QUj4J2kd7IzFC5DiJzk5H2QPp/BpHHk=\n\tdep\tgithub.com/opencontainers/runtime-spec\tv1.3.0\th1:YZupQUdctfhpZy3TM39nN9Ika5CBWT5diQ8ibYCRkxg=\n\tdep\tgithub.com/opentracing/opentracing-go\tv1.2.1-0.20220228012449-10b1cf09e00b\th1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A=\n\tdep\tgithub.com/panjf2000/ants/v2\tv2.12.0\th1:u9JhESo83i/GkZnhfTNuFMMWcNt7mnV1bGJ6FT4wXH8=\n\tdep\tgithub.com/parquet-go/parquet-go\tv0.25.1\th1:l7jJwNM0xrk0cnIIptWMtnSnuxRkwq53S+Po3KG8Xgo=\n\tdep\tgithub.com/pbnjay/memory\tv0.0.0-20210728143218-7b4eea64cf58\th1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0=\n\tdep\tgithub.com/petermattis/goid\tv0.0.0-20260330135022-df67b199bc81\th1:WDsQxOJDy0N1VRAjXLpi8sCEZRSGarLWQevDxpTBRrM=\n\tdep\tgithub.com/philhofer/fwd\tv1.2.0\th1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM=\n\tdep\tgithub.com/pierrec/lz4/v4\tv4.1.27\th1:+PhzhWDrjRj89TH2sw43nE3+4+W8lSxIuQadEHZyjUk=\n\tdep\tgithub.com/pkg/errors\tv0.9.1\th1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\n\tdep\tgithub.com/pkoukk/tiktoken-go\tv0.1.6\th1:JF0TlJzhTbrI30wCvFuiw6FzP2+/bR+FIxUdgEAcUsw=\n\tdep\tgithub.com/planetscale/vtprotobuf\tv0.6.1-0.20250313105119-ba97887b0a25\th1:S1hI5JiKP7883xBzZAr1ydcxrKNSVNm7+3+JwjxZEsg=\n\tdep\tgithub.com/plar/go-adaptive-radix-tree\tv1.0.5\th1:rHR89qy/6c24TBAHullFMrJsU9hGlKmPibdBGU6/gbM=\n\tdep\tgithub.com/pmezard/go-difflib\tv1.0.1-0.20181226105442-5d4384ee4fb2\th1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\n\tdep\tgithub.com/prometheus/client_golang\tv1.23.2\th1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=\n\tdep\tgithub.com/prometheus/client_model\tv0.6.2\th1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=\n\tdep\tgithub.com/prometheus/common\tv0.67.5\th1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4=\n\tdep\tgithub.com/prometheus/procfs\tv0.20.1\th1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc=\n\tdep\tgithub.com/robfig/cron/v3\tv3.0.1\th1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=\n\tdep\tgithub.com/rogpeppe/go-internal\tv1.14.1\th1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=\n\tdep\tgithub.com/rs/xid\tv1.6.0\th1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=\n\tdep\tgithub.com/samber/lo\tv1.38.1\th1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=\n\tdep\tgithub.com/sean-/seed\tv0.0.0-20170313163322-e2103e2c3529\th1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=\n\tdep\tgithub.com/segmentio/asm\tv1.1.3\th1:WM03sfUOENvvKexOLp+pCqgb/WDjsi7EK8gIsICtzhc=\n\tdep\tgithub.com/segmentio/encoding\tv0.4.0\th1:MEBYvRqiUB2nfR2criEXWqwdY6HJOUrCn5hboVOVmy8=\n\tdep\tgithub.com/shirou/gopsutil/v3\tv3.23.12\th1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4=\n\tdep\tgithub.com/sirupsen/logrus\tv1.9.4\th1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=\n\tdep\tgithub.com/spf13/cobra\tv1.10.2\th1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=\n\tdep\tgithub.com/spf13/pflag\tv1.0.10\th1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=\n\tdep\tgithub.com/spkg/bom\tv1.0.0\th1:S939THe0ukL5WcTGiGqkgtaW5JW+O6ITaIlpJXTYY64=\n\tdep\tgithub.com/stretchr/testify\tv1.11.1\th1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\n\tdep\tgithub.com/substrait-io/substrait-protobuf/go\tv0.85.0\th1:zk6MtNWLtDSl8a7qCZRFH0+EIIXVrrd/hsgYK/SQTgM=\n\tdep\tgithub.com/tencentyun/cos-go-sdk-v5\tv0.7.55\th1:9DfH3umWUd0I2jdqcUxrU1kLfUPOydULNy4T9qN5PF8=\n\tdep\tgithub.com/tetratelabs/wabin\tv0.0.0-20230304001439-f6f874872834\th1:ZF+QBjOI+tILZjBaFj3HgFonKXUcwgJ4djLb6i42S3Q=\n\tdep\tgithub.com/tetratelabs/wazero\tv1.8.1-0.20240916092830-1353ca24fef0\th1:NCRnJ+X6eZt3awiReoHCcDuC6Wf+CgWk6p4IDkIuxTo=\n\tdep\tgithub.com/ti-mo/conntrack\tv0.5.1\th1:opEwkFICnDbQc0BUXl73PHBK0h23jEIFVjXsqvF4GY0=\n\tdep\tgithub.com/ti-mo/netfilter\tv0.5.2\th1:CTjOwFuNNeZ9QPdRXt1MZFLFUf84cKtiQutNauHWd40=\n\tdep\tgithub.com/tidwall/btree\tv1.7.0\th1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI=\n\tdep\tgithub.com/tidwall/pretty\tv1.2.1\th1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=\n\tdep\tgithub.com/tinylib/msgp\tv1.6.4\th1:mOwYbyYDLPj35mkA2BjjYejgJk9BuHxDdvRnb6v2ZcQ=\n\tdep\tgithub.com/tklauser/go-sysconf\tv0.3.16\th1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA=\n\tdep\tgithub.com/tklauser/numcpus\tv0.11.0\th1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw=\n\tdep\tgithub.com/tmc/langchaingo\tv0.1.13\th1:rcpMWBIi2y3B90XxfE4Ao8dhCQPVDMaNPnN5cGB1CaA=\n\tdep\tgithub.com/twmb/franz-go\tv1.21.6\th1:+v0dQJVIIuw9uPmPWmPrkoUHs1pPeV8MSwA4eU/Y2kY=\n\tdep\tgithub.com/twmb/franz-go/pkg/kadm\tv1.18.0\th1:WRf/LZmDdcDXwX7WMbtDU++v+b3NzYh2bCGoPMmzirw=\n\tdep\tgithub.com/twmb/franz-go/pkg/kmsg\tv1.13.1\th1:fG5kItwysTk5UXqVwb64EpQEy3TydF3vYYK21nUQ+bI=\n\tdep\tgithub.com/uber/h3-go/v4\tv4.5.0\th1:7ruJoHCtYOCyihXfQRsPb4o6CfkhCBtVeZFM7+z1kww=\n\tdep\tgithub.com/unum-cloud/usearch/golang\tv0.0.0-20260524141737-9fd6b0115dcd\th1:y37IxTSOZw3uSbMJ1gJse5x9Mcrzto6d6iWkb3NnZxs=\n\tdep\tgithub.com/valyala/fastrand\tv1.1.0\th1:f+5HkLW4rsgzdNoleUOB69hyT9IlD2ZQh9GyDMfb5G8=\n\tdep\tgithub.com/valyala/histogram\tv1.2.0\th1:wyYGAZZt3CpwUiIb9AU/Zbllg1llXyrtApRS815OLoQ=\n\tdep\tgithub.com/xdg-go/scram\tv1.2.0\th1:bYKF2AEwG5rqd1BumT4gAnvwU/M9nBp2pTSxeZw7Wvs=\n\tdep\tgithub.com/xdg-go/stringprep\tv1.0.4\th1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=\n\tdep\tgithub.com/xeipuuv/gojsonpointer\tv0.0.0-20190905194746-02993c407bfb\th1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=\n\tdep\tgithub.com/xeipuuv/gojsonreference\tv0.0.0-20180127040603-bd5ef7bd5415\th1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=\n\tdep\tgithub.com/xeipuuv/gojsonschema\tv1.2.0\th1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=\n\tdep\tgithub.com/yalue/onnxruntime_go\tv1.31.0\th1:1ln4YW1SFOFfGJZXe3jNOb2JUSt+l2pEneZfV8HdtFA=\n\tdep\tgithub.com/yanyiwu/gojieba\tv1.4.7\th1:2YkXELcYLTE0SJetq6xv4MjpEikWga6VpFn4jIFFQ/k=\n\tdep\tgithub.com/youmark/pkcs8\tv0.0.0-20240726163527-a2c0da244d78\th1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=\n\tdep\tgithub.com/zeebo/xxh3\tv1.1.0\th1:s7DLGDK45Dyfg7++yxI0khrfwq9661w9EN78eP/UZVs=\n\tdep\tgo.mongodb.org/mongo-driver/v2\tv2.8.0\th1:CxWDGQYY8QQwNjAl/aq2sfWakdnWZynnqJ9F4DhHbP8=\n\tdep\tgo.opentelemetry.io/auto/sdk\tv1.2.1\th1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=\n\tdep\tgo.opentelemetry.io/otel\tv1.43.0\th1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=\n\tdep\tgo.opentelemetry.io/otel/metric\tv1.43.0\th1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=\n\tdep\tgo.opentelemetry.io/otel/trace\tv1.43.0\th1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=\n\tdep\tgo.opentelemetry.io/proto/otlp\tv1.10.0\th1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g=\n\tdep\tgo.starlark.net\tv0.0.0-20250701195324-d457b4515e0e\th1:/WX+ZvcgVJxdIxVR9J3u45ds+Bl4IWPIHRSSICp0t3Q=\n\tdep\tgo.uber.org/automaxprocs\tv1.5.3\th1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=\n\tdep\tgo.uber.org/multierr\tv1.11.0\th1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\n\tdep\tgo.uber.org/ratelimit\tv0.2.0\th1:UQE2Bgi7p2B85uP5dC2bbRtig0C+OeNRnNEafLjsLPA=\n\tdep\tgo.uber.org/zap\tv1.27.1\th1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=\n\tdep\tgo.yaml.in/yaml/v2\tv2.4.4\th1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ=\n\tdep\tgo.yaml.in/yaml/v3\tv3.0.4\th1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=\n\tdep\tgolang.org/x/crypto\tv0.51.0\th1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI=\n\tdep\tgolang.org/x/exp\tv0.0.0-20260410095643-746e56fc9e2f\th1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM=\n\tdep\tgolang.org/x/net\tv0.55.0\th1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=\n\tdep\tgolang.org/x/sync\tv0.22.0\th1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek=\n\tdep\tgolang.org/x/sys\tv0.47.0\th1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs=\n\tdep\tgolang.org/x/text\tv0.37.0\th1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=\n\tdep\tgolang.org/x/time\tv0.15.0\th1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=\n\tdep\tgonum.org/v1/gonum\tv0.17.0\th1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=\n\tdep\tgoogle.golang.org/genproto/googleapis/rpc\tv0.0.0-20260414002931-afd174a4e478\th1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw=\n\tdep\tgoogle.golang.org/grpc\tv1.82.0\th1:vguDnZUPjE26w09A63VoxZPnvPjB5Riyc0mkXPFmAIU=\n\tdep\tgoogle.golang.org/protobuf\tv1.36.11\th1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=\n\tdep\tgopkg.in/ini.v1\tv1.67.1\th1:tVBILHy0R6e4wkYOn3XmiITt/hEVH4TFMYvAX2Ytz6k=\n\tdep\tgopkg.in/natefinch/lumberjack.v2\tv2.2.1\th1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=\n\tdep\tgopkg.in/yaml.v3\tv3.0.1\th1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\n\tdep\tvitess.io/vitess\tv0.24.0\th1:1beFkQ3hbozQv0pmuicu1LL22szH7yVwZR/fofGiXxk=\n\tbuild\t-buildmode=exe\n\tbuild\t-compiler=gc\n\tbuild\t-ldflags=\"-extldflags '-L/workspace/matrixone-mv-pr/cgo -lmo -L/workspace/matrixone-mv-pr/thirdparties/install/lib -lusearch_c -lroaring -fopenmp -Wl,-rpath,/workspace/matrixone-mv-pr/cgo -Wl,-rpath,/workspace/matrixone-mv-pr/thirdparties/install/lib'\"\n\tbuild\tCGO_ENABLED=1\n\tbuild\tCGO_CFLAGS=\"-I/workspace/matrixone-mv-pr/cgo -I/workspace/matrixone-mv-pr/thirdparties/install/include\"\n\tbuild\tCGO_CPPFLAGS=\n\tbuild\tCGO_CXXFLAGS=\n\tbuild\tCGO_LDFLAGS=-L/workspace/matrixone-mv-pr/thirdparties/install/lib\n\tbuild\tGOARCH=amd64\n\tbuild\tGOOS=linux\n\tbuild\tGOAMD64=v1\n\tbuild\tvcs=git\n\tbuild\tvcs.revision=cd5de147d5043ff1795bfb430714afcc9019f144\n\tbuild\tvcs.time=2026-10-16T07:54:19Z\n\tbuild\tvcs.modified=true\n", + "frozen_tracked_non_documentation_inputs": 11061, + "input_ledger_sha256": "d79c34c0080c41095bf5c3b79883798a13b4abeef2b27851673422cf5d32522f", + "canonical_input_map_sha256": "47459bdfb7a7f5fa7be14059bb4aed569151be71a4f91f7a8bcc869a0270bceb", + "limits": [ + "one pinned real 4.0.14/protocol-117 revision and local LOG/TN/two-CN topology", + "deterministic injected commit/ack windows, not every network/WAL failure", + "no arbitrary release-pair, scale, cold-cache or current-head performance claim", + "external review and final publication-head CI remain pending" + ] + }, + "source_sha256": { + "pkg/defines/const.go": "d64b2f0d22f8114454e97482466a45d0e219d269ae823fc3c45d0d027aff9304", + "pkg/bootstrap/versions/v4_0_15/upgrade.go": "188c3bd21719a8b39b68cf802db8dd01d43cbd527d4f0bc50106b2f9429f26c2", + "pkg/bootstrap/versions/v4_0_15/upgrade_test.go": "973a92306c50c1ed20fdd7fdc682d33b0d3d23bbe7415f2f1fe05e9821a5c8a4", + "pkg/mv/task.go": "cb988957ed653d1a549d815e2b4ce37e3a59c09924ba9f45b89455930f8dd9a2", + "pkg/mv/task_test.go": "19703a1428fac040a398b61f71153a98123d549b9616e91d5affcf9357a21933", + "pkg/mv/service.go": "aa91a93269a8ddabb8f5c1e2de2fdf484ee0830a200ae08b537ffbdb02fe18ba", + "pkg/cnservice/server_task.go": "420d8f16e201f58a5239166dbc26306f279ee952c2bc44c453ff1803ca2e1070", + "pkg/cnservice/server_task_test.go": "2ca0fc15483d4d4bd245156c7faa342a5c32327b5ee261119fc18da18bb29f97", + "pkg/frontend/materialized_view.go": "a68b135ac55074e3cf6d73093ced31a349183dc20597c602ac34873caf258aed", + "pkg/sql/plan/materialized_view.go": "785f467718f8a2e8d603877a0c8de4d2e770d302432d0c28135bbd46216c8286", + "pkg/sql/plan/materialized_view_test.go": "9859c457a5f7f5dcadecfb68f6a804899705fae934efc5f44c1a828dd735b15b", + "pkg/sql/compile/materialized_view.go": "e76d7d626a443819c935524a0b38247e9373d58add122fa4ac4534782111a922", + "pkg/sql/compile/materialized_view_test.go": "fe75e1ce68e76a60a22d6a219e230cb26789f6a1580e607befdd524c21720fd7", + "pkg/sql/parsers/dialect/mysql/mysql_sql.y": "e24e0f4335fe1d2e17877a59f10e2088da335da23900ba028f3ca2a5b21fb10e", + "pkg/sql/parsers/dialect/mysql/mysql_sql.go": "f93d82c7d5c2771d803dd4027eb14657c09e754001117d52aacf63c1dd2c8283", + "cmd/mo-service/materialized_view_faults.go": "8eeaece89993e635229e2b97eb68c2f55a9155f6f6b3bbe7849a0f3929b08ac4", + "optools/materialized_view_recovery.py": "6e1034b9a3b6f2d9fc3ccf565243c1340310c1d768c069dba9847b502cc30a94", + "test/materialized_view/native_probe/main.go": "2030ccc5981c5c56b636a82ce8056e902483221411dcd60377184ee7fd1d5fee" + }, + "local_validation": { + "normal_owning_packages": "ok \tgithub.com/matrixorigin/matrixone/pkg/defines\t0.010s\nok \tgithub.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_15\t0.087s\nok \tgithub.com/matrixorigin/matrixone/pkg/mv\t0.225s\nok \tgithub.com/matrixorigin/matrixone/pkg/frontend\t24.021s\nok \tgithub.com/matrixorigin/matrixone/pkg/sql/plan\t48.707s\nok \tgithub.com/matrixorigin/matrixone/pkg/sql/compile\t14.783s\nok \tgithub.com/matrixorigin/matrixone/pkg/sql/parsers/dialect/mysql\t1.087s\nok \tgithub.com/matrixorigin/matrixone/pkg/cnservice\t8.683s\n", + "vet": { + "packages": [ + "defines", + "v4_0_15", + "mv", + "frontend", + "plan", + "compile" + ], + "exit": 0 + }, + "configured_lint": { + "exit": 0, + "result": "0 issues.\n" + }, + "builds": { + "old117": 0, + "tagged118": 0, + "production118": 0 + }, + "initial_focused_attempt": "local link/build failed when cache exhausted disk; raw log retained; no product change; full normal suites pass after removing only old generated caches", + "race_evidence": "previous admission/retry race roots and owning race captures remain mechanism evidence for unchanged concurrency; not represented as new merge-head race executions", + "upstream_117_collation_controls": { + "exit": 0, + "named_roots": [ + "TestLeastGreatestCollationCharTieAndNull", + "TestLeastGreatestCollationOverloadRejectsNonString", + "TestLeastGreatestCollationOverloadSelection", + "TestLeastGreatestCollationRemoteFeature" + ], + "result": "ok \tgithub.com/matrixorigin/matrixone/pkg/sql/plan/function\t0.209s\nok \tgithub.com/matrixorigin/matrixone/pkg/pb/plan\t0.077s\n" + }, + "explain_merged_consumer": { + "normal": "ok \tgithub.com/matrixorigin/matrixone/pkg/sql/plan/explain\t0.326s\n", + "vet_exit": 0, + "configured_lint": "0 issues.\n" + } + }, + "native_diagnostics": { + "upgrade_wait_stack": [ + "goroutine 69 [select]:\ngithub.com/matrixorigin/matrixone/pkg/util/fault.(*faultEntry).doWithContext(0x2705d8890000, {0xb69f7d0, 0x2705ddb70780})\n\t/workspace/matrixone-mv-pr/pkg/util/fault/fault.go:278 +0xcd\ngithub.com/matrixorigin/matrixone/pkg/util/fault.triggerFaultInDomain({0xb69f7d0, 0x2705ddb70780}, 0x2705dcf7ca80?, {0x5c3a701, 0x1c}, 0x1)\n\t/workspace/matrixone-mv-pr/pkg/util/fault/fault.go:405 +0x15b\ngithub.com/matrixorigin/matrixone/pkg/util/fault.TriggerFaultInDomainWithContext(...)\n\t/workspace/matrixone-mv-pr/pkg/util/fault/fault.go:381\ngithub.com/matrixorigin/matrixone/pkg/util/fault.TriggerFaultWithContext({0xb69f7d0?, 0x2705ddb70780?}, {0x5c3a701?, 0x0?})\n\t/workspace/matrixone-mv-pr/pkg/util/fault/fault.go:373 +0x30\ngithub.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_15.(*versionHandle).HandleClusterUpgrade(0xb69f878?, {0xb69f7d0, 0x2705ddb70780}, {0xb69fed0, 0x2705dd48da40})\n\t/workspace/matrixone-mv-pr/pkg/bootstrap/versions/v4_0_15/upgrade.go:70 +0x8c\ngithub.com/matrixorigin/matrixone/pkg/bootstrap.(*service).doUpgrade(0x2705da3ca160, {0xb69f878, 0x2705dea29b20}, {0x2711, {0x2705ddb02ae8, 0x6}, {0x2705ddb02b00, 0x6}, {0x2705ddb02b06, 0x6}, ...}, ...)\n\t/workspace/matrixone-mv-pr/pkg/bootstrap/service_upgrade.go:555 +0x686\ngithub.com/matrixorigin/matrixone/pkg/bootstrap.(*service).performUpgrade(0x2705da3ca160, {0xb69f878, 0x2705dea29b20}, {{0x5bb4863, 0x6}, 0x0, {0x5bb485d, 0x6}, 0x1, 0x0, ...}, ...)\n\t/workspace/matrixone-mv-pr/pkg/bootstrap/service_upgrade.go:478 +0xbcf\ngithub.com/matrixorigin/matrixone/pkg/bootstrap.(*service).newUpgradePass.func1.1({0xb69fed0, 0x2705dd48da40})\n\t/workspace/matrixone-mv-pr/pkg/bootstrap/service_upgrade.go:388 +0x385\ngithub.com/matrixorigin/matrixone/pkg/sql/compile.(*sqlExecutor).ExecTxn(_, {_, _}, _, {0x0, {0x0, 0x0}, {0x5bc399c, 0xa}, 0x0, ...})\n\t/workspace/matrixone-mv-pr/pkg/sql/compile/sql_executor.go:207 +0x116\ngithub.com/matrixorigin/matrixone/pkg/bootstrap.(*service).newUpgradePass.func1()\n\t/workspace/matrixone-mv-pr/pkg/bootstrap/service_upgrade.go:366 +0x70a\ngithub.com/matrixorigin/matrixone/pkg/bootstrap.(*service).asyncUpgradeTask(0x2705da3ca160, {0xb69f7d0, 0x2705dc0580f0})\n\t/workspace/matrixone-mv-pr/pkg/bootstrap/service_upgrade.go:425 +0x16d\ngithub.com/matrixorigin/matrixone/pkg/common/stopper.(*Stopper).doRunCancelableTask.func1()\n\t/workspace/matrixone-mv-pr/pkg/common/stopper/stopper.go:281 +0x5b\ncreated by github.com/matrixorigin/matrixone/pkg/common/stopper.(*Stopper).doRunCancelableTask in goroutine 601\n\t/workspace/matrixone-mv-pr/pkg/common/stopper/stopper.go:278 +0xba" + ], + "old_startup_refusal": [ + "{\"level\":\"ERROR\",\"time\":\"2026/10/16 08:48:12.435502 +0000\",\"caller\":\"cnservice/server_view_metadata_admission.go:139\",\"msg\":\"error: not supported: CN ee1dccb4-4d3c-41f8-b482-5251dc7a41bf requires persisted expression protocol version 118 (local version 117)\",\"span\":{\"trace_id\":\"df021066-4135-b31f-eaff-af0723430b9b\",\"span_id\":\"91069b240be5ec84\"}}", + "{\"level\":\"ERROR\",\"time\":\"2026/10/16 08:48:12.435606 +0000\",\"name\":\"cn-service\",\"caller\":\"cnservice/server_heartbeat.go:316\",\"msg\":\"failed to apply view metadata admission heartbeat response\",\"uuid\":\"ee1dccb4-4d3c-41f8-b482-5251dc7a41bf\",\"error\":\"not supported: CN ee1dccb4-4d3c-41f8-b482-5251dc7a41bf requires persisted expression protocol version 118 (local version 117)\"}" + ], + "mixed_upgrade_fence": [ + "{\"level\":\"ERROR\",\"time\":\"2026/10/16 08:46:17.809808 +0000\",\"caller\":\"versions/upgrade_strategy.go:257\",\"msg\":\"error: not supported: upgrade requires all CNs to support protocol version 118: node \\\"ee1dccb4-4d3c-41f8-b482-5251dc7a41bf\\\" is at version 117\"}", + "{\"level\":\"ERROR\",\"time\":\"2026/10/16 08:46:17.809859 +0000\",\"name\":\"cn-service.upgrade-framework\",\"caller\":\"log/logger.go:134\",\"msg\":\"failed to handle version upgrade\",\"service\":\"dd1dccb4-4d3c-41f8-b482-5251dc7a41bf\",\"uuid\":\"dd1dccb4-4d3c-41f8-b482-5251dc7a41bf\",\"upgrade\":\"0th: 4.0.14 -> 4.0.15 (true, false, 0, 0), state 0\",\"final\":\"4.0.15\",\"error\":\"not supported: upgrade requires all CNs to support protocol version 118: node \\\"ee1dccb4-4d3c-41f8-b482-5251dc7a41bf\\\" is at version 117\"}" + ], + "cron_admission_denial": [ + "{\"level\":\"ERROR\",\"time\":\"2026/10/16 08:46:12.669267 +0000\",\"caller\":\"mv/task.go:64\",\"msg\":\"error: invalid state materialized view catalogs are not installed\"}", + "{\"level\":\"ERROR\",\"time\":\"2026/10/16 08:46:12.669342 +0000\",\"caller\":\"compile/sql_executor.go:209\",\"msg\":\"internal sql executor error\",\"error\":\"invalid state materialized view catalogs are not installed\",\"sql\":\"\",\"txn\":\"70f70f4866a9b62a18def62c5af9260c/Active/S:1792140372660959071-1\"}" + ] + } +} diff --git a/docs/design/materialized_view_performance_results.json b/docs/design/materialized_view_performance_results.json new file mode 100644 index 0000000000000..c25b5dfb242c2 --- /dev/null +++ b/docs/design/materialized_view_performance_results.json @@ -0,0 +1,538 @@ +{ + "experiments": [ + { + "name": "B02 explicit rollup", + "refresh_ms": 0, + "result_rows": 8, + "RawMS": [ + 22.606, + 99.539, + 31.919, + 157.606, + 23.832, + 19.62, + 21.808, + 174.199, + 30.615, + 32.063, + 86.893, + 26.547, + 24.303, + 57.684, + 55.411, + 75.088, + 88.465, + 44.671, + 70.283, + 21.819, + 21.317, + 24.992, + 44.359, + 120.086, + 69.031, + 47.464, + 113.306, + 38.439, + 35.682, + 33.441, + 24.337, + 21.989, + 22.258, + 21.027, + 21.657, + 25.528, + 28.207, + 20.489, + 20.541, + 29.134, + 22.048, + 29.651, + 30.826, + 33.716, + 27.838, + 27.17, + 24.981, + 28.871, + 29.967, + 23.142 + ], + "MVMS": [ + 4.935, + 2.743, + 3.309, + 4.026, + 4.862, + 3.187, + 2.899, + 2.919, + 3.64, + 3.21, + 4.066, + 3.391, + 3.228, + 2.969, + 4.046, + 2.981, + 4.013, + 3.59, + 3.792, + 2.954, + 3.295, + 2.946, + 16.276, + 3.01, + 5.755, + 3.041, + 23.779, + 6.458, + 3.98, + 3.417, + 4.005, + 3.583, + 3.417, + 3.726, + 2.896, + 3.251, + 3.244, + 2.843, + 3.306, + 4.082, + 2.7, + 3.024, + 3.799, + 3.124, + 3.626, + 3.537, + 3.257, + 3.068, + 3.307, + 3.186 + ], + "median_ratio": 8.885278113663846 + }, + { + "name": "B03 repeated join", + "refresh_ms": 40.947, + "result_rows": 8, + "RawMS": [ + 25.017, + 18.333, + 23.565, + 21.627, + 27.786, + 18.948, + 17.49, + 20.219, + 17.92, + 18.872, + 18.212, + 17.407, + 18.392, + 23.927, + 23.102, + 17.351, + 20.823, + 23.75, + 17.719, + 29.115, + 36.699, + 18.394, + 18.337, + 24.452, + 18.011, + 18.015, + 17.8, + 24.137, + 18.234, + 17.651, + 18.084, + 18.959, + 21.162, + 21.258, + 21.951, + 17.589, + 16.79, + 20.998, + 23.247, + 25.349, + 18.66, + 30.364, + 20.198, + 17.646, + 17.477, + 23.223, + 23.522, + 17.463, + 18.021, + 18.294 + ], + "MVMS": [ + 3.756, + 3.06, + 3.534, + 3.787, + 4.251, + 4.102, + 3.457, + 4.06, + 3.614, + 3.309, + 3.528, + 3.405, + 3.509, + 3.572, + 3.748, + 3.461, + 3.649, + 6.069, + 3.455, + 3.135, + 4.03, + 6.738, + 3.487, + 3.408, + 3.813, + 3.128, + 3.611, + 3.153, + 3.224, + 3.268, + 3.362, + 3.727, + 3.386, + 3.535, + 3.564, + 3.874, + 3.475, + 3.326, + 7.41, + 7.335, + 3.507, + 3.51, + 3.951, + 3.477, + 3.683, + 3.2, + 3.533, + 3.476, + 3.804, + 3.284 + ], + "median_ratio": 5.356181843931455 + }, + { + "name": "B05 high cardinality control", + "refresh_ms": 34.56, + "result_rows": 10000, + "RawMS": [ + 19.113, + 13.407, + 12.017, + 11.818, + 16.718, + 12.24, + 11.89, + 31.253, + 16.064, + 13.85, + 14.242, + 14.347, + 13.606, + 68.704, + 16.445, + 12.788, + 14.086, + 21.856, + 45.484, + 45.779, + 107.627, + 26.769, + 14.612, + 14.201, + 14.181, + 17.664, + 35.384, + 15.312, + 15.142, + 37.767, + 47.059, + 25.3, + 35.19, + 21.977, + 17.161, + 17.266, + 13.709, + 16.259, + 15.965, + 19.095, + 21.052, + 13.697, + 19.784, + 18.061, + 15.283, + 15.213, + 13.241, + 12.932, + 22.868, + 20.706 + ], + "MVMS": [ + 12.076, + 12.798, + 12.781, + 11.156, + 12.307, + 11.784, + 12.142, + 12.431, + 11.898, + 14.159, + 12.463, + 13.691, + 13.58, + 27.788, + 17.892, + 30.98, + 21.079, + 22.605, + 12.747, + 26.32, + 15.354, + 23.988, + 16.115, + 17.37, + 13.697, + 23.621, + 14.198, + 15.416, + 31.82, + 14.51, + 40.604, + 14.005, + 32.278, + 14.06, + 49.472, + 20.261, + 18.372, + 17.434, + 12.804, + 16.025, + 12.693, + 19, + 17.639, + 19.925, + 15.474, + 16.487, + 14.062, + 16.925, + 35.564, + 20.301 + ], + "median_ratio": 1.0382551827042128 + } + ], + "started": "2026-10-13T01:45:19.600848901Z", + "passed_cases": [ + "experimental gate", + "deferred population", + "NULL and aggregate semantics", + "independent typed aggregate oracle", + "last committed materialization", + "insert update delete refresh", + "read only: insert into totals(k) values(4)", + "read only: update totals set k=4", + "read only: delete from totals", + "read only: truncate table totals", + "read only: replace into totals(k) values(4)", + "read only: alter table totals add x int", + "read only: drop table totals", + "dependency restrict: alter table facts add x int", + "dependency restrict: truncate table facts", + "dependency restrict: drop table facts", + "dependency restrict: drop database mv_validation", + "failed DROP preserves current database", + "unsupported definition: select rand() from facts", + "unsupported definition: select now() from facts", + "unsupported definition: select distinct k from facts", + "unsupported definition: select count(distinct k) from facts", + "unsupported definition: select * from facts limit 1", + "unsupported definition: select row_number() over(order by id) from facts", + "unsupported definition: select * from totals", + "inner join refresh", + "empty aggregate", + "refresh in user transaction", + "SHOW CREATE", + "scheduled refresh", + "SHOW state and full source timestamp", + "refresh history", + "repeat refresh idempotent rows", + "IF NOT EXISTS no replacement", + "object kind collision", + "duplicate output heading", + "minimum schedule interval", + "MV nesting", + "outer join", + "random sample", + "temporary source", + "grouped empty has zero rows", + "all NULL typed oracle", + "projection and filter", + "dimension mutation", + "captured SQL mode", + "captured fixed-offset timezone", + "create MV in user transaction", + "rename dependent source", + "foreign key into MV", + "prepared read after refresh", + "concurrent readers see complete publications", + "concurrent refresh publication", + "MV grant requires source SELECT", + "MV plus source grant permits read", + "prepared source ACL revocation", + "nonowner refresh rejected", + "nonowner drop rejected", + "SHOW owner isolation", + "same-name multi-tenant source and MV isolation", + "cancelled client read", + "benchmark result equality", + "B02 explicit rollup result equality", + "B03 repeated join result equality", + "B05 high cardinality control result equality", + "retained restart fixture" + ], + "source_rows": 1000000, + "refresh_ms": 151.27, + "baseline_ms": [ + 27.307, + 24.637, + 130.103, + 34.609, + 93.067, + 59.278, + 59.383, + 74.461, + 67.68, + 93.34, + 78.838, + 65.066, + 32.973, + 74.008, + 24.275, + 14.956, + 15.829, + 20.21, + 15.058, + 14.397, + 84.692, + 74.228, + 29.908, + 29.426, + 63.614, + 47.836, + 30.119, + 15.084, + 19.597, + 15.378, + 150.272, + 37.486, + 27.987, + 30.92, + 22.818, + 21.039, + 19.757, + 14.509, + 13.923, + 14.574, + 14.325, + 16.714, + 15.251, + 149.381, + 28.145, + 21.722, + 25.409, + 27.215, + 23.273, + 18.345 + ], + "materialized_ms": [ + 5.137, + 6.458, + 3.285, + 3.086, + 4.065, + 3.247, + 20.899, + 46.711, + 17.231, + 15.513, + 18.03, + 3.281, + 11.395, + 3.276, + 4.047, + 3.031, + 3.095, + 2.617, + 3.064, + 2.479, + 12.988, + 3.266, + 9.774, + 2.77, + 17.453, + 7.961, + 5.58, + 5.274, + 3.021, + 2.739, + 9.046, + 10.426, + 4.98, + 2.85, + 4.579, + 2.789, + 5.536, + 4.55, + 2.702, + 3.174, + 3.174, + 3.434, + 11.031, + 2.731, + 5.401, + 3.797, + 3.504, + 3.472, + 3.65, + 2.832 + ], + "median_speedup": 7.425003357056532, + "raw_plan": [ + [ + "Project" + ], + [ + " -> Aggregate" + ], + [ + " Group Key: bench.k" + ], + [ + " Aggregate Functions: sum(bench.v), starcount(1)" + ], + [ + " -> Table Scan on mv_validation.bench" + ] + ], + "materialized_plan": [ + [ + "Project" + ], + [ + " -> Table Scan on mv_validation.bench_mv" + ] + ], + "materialized_rows": 128, + "original_upper_median_speedup": 7.370819067685014, + "median_method": "average of two central observations for even sample count" +} \ No newline at end of file diff --git a/docs/design/materialized_view_publication_results.json b/docs/design/materialized_view_publication_results.json new file mode 100644 index 0000000000000..e62096f149a93 --- /dev/null +++ b/docs/design/materialized_view_publication_results.json @@ -0,0 +1,625 @@ +{ + "publication_base": "3e50e1b32d8da61bbbf70c89989fb08b671809de", + "prototype_base": "dd38098853ea197699ed3fac3e69dc53975ac061", + "protocol_floor": 112, + "total_sql_checks": 84, + "performance_scope": "Publication timings ran with concurrent lint/race build work and are diagnostic; isolated prototype observations remain in materialized_view_performance_results.json.", + "runs": { + "main": { + "case_count": 67, + "original_path": "/workspace/mv-publish-artifacts/sql-main-results.json", + "original_sha256": "6cb734795515e584ab582ee62a76bf11e1e51bff877d0781ac3383ee7e2a7d87", + "result": { + "experiments": [ + { + "name": "B02 explicit rollup", + "refresh_ms": 0, + "result_rows": 8, + "RawMS": [ + 23.076, + 35.452, + 107.173, + 51.568, + 97.134, + 23.613, + 20.974, + 25.66, + 63.239, + 76.581, + 36.972, + 86.563, + 36.981, + 22.773, + 45.46, + 72.792, + 105.035, + 68.152, + 90.832, + 29.921, + 34.892, + 97.122, + 69.864, + 129.272, + 27.44, + 22.977, + 36.371, + 131.86, + 77.085, + 61.532, + 28.498, + 30.262, + 21.539, + 246.654, + 51.318, + 25.088, + 24.751, + 31.15, + 142.502, + 129.975, + 31.053, + 42.153, + 30.045, + 137.841, + 59.211, + 64.468, + 33.458, + 22.133, + 25.043, + 77.475 + ], + "MVMS": [ + 3.189, + 2.796, + 24.457, + 4.471, + 5.767, + 4.413, + 3.05, + 6.968, + 34.262, + 12.671, + 3.598, + 2.652, + 3.431, + 4.862, + 4.688, + 4.9, + 6.645, + 3.318, + 5.865, + 2.808, + 2.783, + 2.743, + 4.667, + 30.962, + 3.432, + 2.824, + 12.828, + 11.274, + 5.633, + 3.364, + 6.782, + 3.025, + 3.016, + 2.604, + 3.523, + 2.694, + 2.894, + 2.706, + 13.304, + 3.313, + 3.24, + 3.21, + 2.906, + 5.616, + 9.465, + 4.964, + 3.034, + 3.091, + 2.63, + 3.096 + ], + "median_ratio": 12.765991548885328 + }, + { + "name": "B03 repeated join", + "refresh_ms": 45.638, + "result_rows": 8, + "RawMS": [ + 25.851, + 23.491, + 25.014, + 59.997, + 116.464, + 46.434, + 22.259, + 20.591, + 20.617, + 87.236, + 34.397, + 32.71, + 44.971, + 30.261, + 59.408, + 18.281, + 22.286, + 18.562, + 85.383, + 59.238, + 43.561, + 82.502, + 41.039, + 23.893, + 29.219, + 137.256, + 92.761, + 50.783, + 21.528, + 17.26, + 20.948, + 18.212, + 149.787, + 70.053, + 32.987, + 38.326, + 20.457, + 18.589, + 24.72, + 29.378, + 19.41, + 22.978, + 17.35, + 19.44, + 23.765, + 19.671, + 20.533, + 22.195, + 20.275, + 21.075 + ], + "MVMS": [ + 2.971, + 3.027, + 3.055, + 2.655, + 5.475, + 4.202, + 3.133, + 3.237, + 4.857, + 4.391, + 3.891, + 3.734, + 4.516, + 3.193, + 4.135, + 3.179, + 3.052, + 3.386, + 30.603, + 4.727, + 3.225, + 2.939, + 4.044, + 3.385, + 3.975, + 3.372, + 4.368, + 3.327, + 3.377, + 3.042, + 5.477, + 4.425, + 20.228, + 7.066, + 4.071, + 3.679, + 3.058, + 7.315, + 2.964, + 3.406, + 3.029, + 2.925, + 3.139, + 4.148, + 5.352, + 5.763, + 3.053, + 2.986, + 3.111, + 4.461 + ], + "median_ratio": 7.322438162544169 + }, + { + "name": "B05 high cardinality control", + "refresh_ms": 39.606, + "result_rows": 10000, + "RawMS": [ + 13.459, + 18.818, + 12.992, + 21.017, + 11.881, + 11.666, + 12.053, + 13.691, + 20.995, + 17.7, + 22.056, + 12.712, + 13.905, + 12.6, + 11.97, + 13.388, + 14.602, + 13.022, + 12.773, + 21.299, + 14.571, + 11.829, + 15.336, + 15.897, + 13.496, + 22.331, + 13.379, + 16.026, + 18.259, + 14.256, + 13.433, + 38.88, + 15.928, + 23.033, + 11.712, + 13.276, + 12.675, + 15.273, + 21.39, + 16.942, + 17.963, + 14.555, + 24.777, + 14.355, + 17.867, + 20.841, + 13.522, + 21.35, + 12.15, + 16.801 + ], + "MVMS": [ + 16.807, + 16.097, + 12.704, + 13.285, + 11.356, + 11.073, + 12.929, + 12.847, + 11.73, + 12.811, + 12.444, + 14.407, + 14.743, + 11.181, + 14.123, + 17.199, + 12.146, + 11.587, + 16.221, + 13.083, + 20.189, + 16.118, + 17.545, + 11.407, + 14.614, + 15.621, + 14.693, + 12.419, + 22.182, + 12.364, + 13.125, + 25.538, + 11.644, + 13.615, + 12.325, + 14.115, + 19.327, + 13.777, + 17.311, + 13.449, + 16.496, + 14.643, + 12.085, + 18.536, + 14.062, + 12.115, + 19.822, + 14.104, + 29.96, + 12.603 + ], + "median_ratio": 1.0462301088401162 + } + ], + "started": "2026-10-13T03:38:31.889913267Z", + "passed_cases": [ + "experimental gate", + "deferred population", + "NULL and aggregate semantics", + "independent typed aggregate oracle", + "last committed materialization", + "insert update delete refresh", + "read only: insert into totals(k) values(4)", + "read only: update totals set k=4", + "read only: delete from totals", + "read only: truncate table totals", + "read only: replace into totals(k) values(4)", + "read only: alter table totals add x int", + "read only: drop table totals", + "dependency restrict: alter table facts add x int", + "dependency restrict: truncate table facts", + "dependency restrict: drop table facts", + "dependency restrict: drop database mv_validation", + "failed DROP preserves current database", + "unsupported definition: select rand() from facts", + "unsupported definition: select now() from facts", + "unsupported definition: select distinct k from facts", + "unsupported definition: select count(distinct k) from facts", + "unsupported definition: select * from facts limit 1", + "unsupported definition: select row_number() over(order by id) from facts", + "unsupported definition: select * from totals", + "inner join refresh", + "empty aggregate", + "refresh in user transaction", + "SHOW CREATE", + "scheduled refresh", + "SHOW state and full source timestamp", + "refresh history", + "repeat refresh idempotent rows", + "IF NOT EXISTS no replacement", + "object kind collision", + "duplicate output heading", + "minimum schedule interval", + "MV nesting", + "outer join", + "random sample", + "temporary source", + "grouped empty has zero rows", + "all NULL typed oracle", + "projection and filter", + "dimension mutation", + "captured SQL mode", + "captured context with escaped source identity", + "captured fixed-offset timezone", + "create MV in user transaction", + "rename dependent source", + "foreign key into MV", + "prepared read after refresh", + "concurrent readers see complete publications", + "concurrent refresh publication", + "MV grant requires source SELECT", + "MV plus source grant permits read", + "prepared source ACL revocation", + "nonowner refresh rejected", + "nonowner drop rejected", + "SHOW owner isolation", + "same-name multi-tenant source and MV isolation", + "cancelled client read", + "benchmark result equality", + "B02 explicit rollup result equality", + "B03 repeated join result equality", + "B05 high cardinality control result equality", + "retained restart fixture" + ], + "source_rows": 1000000, + "refresh_ms": 81.466, + "baseline_ms": [ + 24.294, + 39.798, + 45.14, + 32.725, + 255.436, + 129.802, + 108.475, + 93.633, + 156.204, + 44.221, + 67.609, + 46.738, + 101.098, + 80.041, + 49.292, + 88.106, + 132.71, + 44.91, + 56.018, + 49.911, + 58.973, + 45.822, + 112.92, + 62.949, + 80.737, + 361.904, + 129.154, + 24.996, + 34.922, + 35.35, + 30.334, + 35.569, + 30.117, + 109.991, + 59.631, + 17.119, + 18.29, + 14.371, + 28.329, + 125.35, + 30.712, + 19.87, + 46.842, + 17.322, + 14.457, + 16.571, + 20.325, + 18.008, + 43.563, + 30.709 + ], + "materialized_ms": [ + 3.923, + 3.915, + 7.625, + 3.334, + 11.151, + 11.81, + 76.786, + 8.47, + 56.001, + 29.316, + 10.27, + 3.541, + 129.961, + 5.838, + 3.663, + 24.511, + 6.31, + 10.607, + 5.596, + 2.85, + 5.314, + 3.708, + 5.146, + 4.022, + 29.39, + 5.044, + 4.538, + 3.896, + 2.988, + 5.336, + 3.415, + 3.058, + 6.474, + 27.429, + 6.004, + 2.807, + 2.737, + 2.887, + 3.771, + 6.182, + 3.068, + 2.374, + 54.128, + 25.313, + 3.591, + 2.983, + 2.402, + 2.768, + 3.837, + 4.742 + ], + "median_speedup": 9.295115471081138, + "raw_plan": [ + [ + "Project" + ], + [ + " -> Aggregate" + ], + [ + " Group Key: bench.k" + ], + [ + " Aggregate Functions: sum(bench.v), starcount(1)" + ], + [ + " -> Table Scan on mv_validation.bench" + ] + ], + "materialized_plan": [ + [ + "Project" + ], + [ + " -> Table Scan on mv_validation.bench_mv" + ] + ], + "materialized_rows": 128 + } + }, + "restart": { + "case_count": 3, + "original_path": "/workspace/mv-publish-artifacts/restart-main-results.json", + "original_sha256": "b0229321a14a2d6a4fdb7608439a3189b506cebf659aa306b957bc2d0798d9cd", + "result": { + "experiments": null, + "started": "2026-10-13T03:42:45.196769793Z", + "passed_cases": [ + "restart persisted materialization", + "restart persisted history", + "refresh after restart" + ], + "source_rows": 1000000, + "refresh_ms": 0, + "baseline_ms": null, + "materialized_ms": null, + "median_speedup": 0, + "raw_plan": null, + "materialized_plan": null, + "materialized_rows": 0 + } + }, + "failure_cleanup": { + "case_count": 5, + "original_path": "/workspace/mv-publish-artifacts/edge-main-results.json", + "original_sha256": "b7721051128a56d84011be719d7f8695fe01674f298f47b146e25a2ea82ae6c5", + "result": { + "experiments": null, + "started": "2026-10-13T03:42:45.488386197Z", + "passed_cases": [ + "native source-expression refresh failure", + "native failed refresh preserves rows", + "native failed refresh diagnostic", + "drop removes MV state", + "dependency cleanup permits database drop" + ], + "source_rows": 1000000, + "refresh_ms": 0, + "baseline_ms": null, + "materialized_ms": null, + "median_speedup": 0, + "raw_plan": null, + "materialized_plan": null, + "materialized_rows": 0 + } + }, + "two_cn": { + "case_count": 9, + "original_path": "/workspace/mv-publish-artifacts/multi-cn-main-results.json", + "original_sha256": "e51f74c699c13c891d7dce7f4997f119bedde74ba460a870c464076adbccadf2", + "result": { + "experiments": null, + "started": "2026-10-13T03:42:46.232185122Z", + "passed_cases": [ + "second CN rejects unpopulated view", + "cross-CN publication visibility", + "second CN can refresh independently", + "two-CN concurrent publication version 2", + "two-CN concurrent publication version 3", + "two-CN concurrent publication version 4", + "two-CN concurrent publication version 5", + "two-CN concurrent publication version 6", + "cross-CN terminal history" + ], + "source_rows": 4, + "refresh_ms": 0, + "baseline_ms": null, + "materialized_ms": null, + "median_speedup": 0, + "raw_plan": null, + "materialized_plan": null, + "materialized_rows": 0 + } + } + } +} diff --git a/docs/design/materialized_view_recovery_self_review.md b/docs/design/materialized_view_recovery_self_review.md new file mode 100644 index 0000000000000..443054140fd22 --- /dev/null +++ b/docs/design/materialized_view_recovery_self_review.md @@ -0,0 +1,207 @@ +# Upgrade and crash validation follow-up + +Review target: PR #30085, baseline +`d50c4c77513c08837cf6ba351fae047ff9728bd2`. Latest inspected main is +`ac55588b8d4bf19c803a31bbd8248b7f63ad8122`; its lockservice/window changes do +not conflict with these files. The earlier exact baseline's ALL CI +38843251708, Connector/J 38843254257 and Iceberg 38843254214 all completed +successfully. Their optional compatibility jobs were skipped. Review +5543067251 requires additional native upgrade/crash validation and accepts +revision 3's lifecycle policy; this follow-up closes those validation boundaries +without changing the selected feature scope or claiming external approval. + +## Change map and invariants + +| Closure | Owner and consumers | Risk/proof | +| --- | --- | --- | +| MV catalog migration | 4.0.15 handler and existing common-protocol inventory | R3: no persistent MV catalogs before all inventoried nodes support 117; zero DDL on old-node/query-error paths; real mixed-node rejection, interrupted transaction and restart/repetition | +| Refresh fault boundaries | Native refresh transaction callback and return to task-service executor | R3: no visible partial tuple before commit; durable success survives response loss and CN death; same task/run identity acknowledges without repeated post-commit publication | +| Explicitly tagged startup initializer | mo-service build and existing fault owner | R2: environment startup injection exists only with `matrixone_mv_faults`; production build excludes it; native upgrade phase proves tagged entry, normal production build proves ordinary delivery path | +| Native probe/driver | SQL connection/result owner and process-owning Python driver | R3 fixture: two rows, normal authentication, real LOG/TN/CN, old/new CN overlap, immediate resource ownership/finally cleanup and bounded SQL/phase waits; no manually edited upgrade/run/task state | +| Documentation and frozen ledger | C07/C10/C12, reproduction and PR evidence | R0: separate historical performance, local instrumented runs, production build and final-head remote checks | + +The upgrade metadata's required protocol was previously not consumed: the +framework checks it before tenant enumeration, but this handler has no tenant +phase. The handler now calls the existing inventory gate before its first DDL. +There is no new capability namespace, retry owner, catalog version, protocol +allocation, scheduler, persistent state or downgrade bypass. + +Two disabled fault lookups per full refresh and four per migration add constant +work outside per-row processing. ECHO injects an error only after a real native +commit and routes it through the existing durable success resolution. WAIT uses +the existing context; the native driver kills the exact owned CN while keeping +LOG/TN alive. There is no added production goroutine or unbounded collection. +No new performance benchmark is needed for these constant, disabled lookups; +the historical performance results remain explicitly historical. + +Test fixtures reuse the existing refresh executor and upgrade suite. The mock +records its committed last-run identity on actual successful callback commit, +so the new post-commit fault case exercises the real resolution branch. Fault +state is removed in cleanup, with deferred disable even if a cleanup assertion +fails; memory-pool deletion likewise runs on an assertion failure. No selected +test is parallel with another owner of the package's fault registry. + +The native suite cannot reuse an ordinary BVT service: it must kill a CN and +upgrade persistent old storage while asserting actual task replay. Three +separate processes keep durability owners alive; only the compatibility phase +adds a fourth old/new CN. Two source rows distinguish retained and newly +published values. Startup/inventory/scheduler time dominates; no load or +wall-clock speed assertion is introduced. Existing ordinary SQL and multi-CN +CI tests remain necessary and retain all their assertions. + +## Validation and evidence boundaries + +- Owning MV and 4.0.15 suites pass in normal mode; the complete bootstrap suite + passes with the new gate. Final test-cleanup edits are rerun separately. +- `TestMaterializedViewRefreshFailureBoundaries` is selected by named JSON test + events, including the injected native-boundary analogue. Measured race body + T=0.010 s yields N=clamp(floor(30/T),1,100)=100; the exact root passes 100 + repetitions. The full MV owning package passes under race. No skips or race + reports are accepted. +- Five-package vet and configured incremental lint cover MV, 4.0.15, + bootstrap, mo-service and native_probe, including the startup build tag; + configured lint reports zero issues. Both tagged and ordinary service builds + succeed. Python syntax and the actual native driver are checked separately. +- Native results and the exact source/configuration/binary fingerprints are in + `materialized_view_native_recovery_results.json`. Old source matches all + 11,132 tracked blobs of fcad62a8. Normal login is used throughout. Pre-delivery + current binaries report d50c4c77 plus `vcs.modified=true`, explicitly distinct + from an unmodified publication commit. +- Native startup troubleshooting exposed a storage-only `-launch` restriction + and shared status-port conflict; use separate `-cfg` processes/ports. Old-node + refusal can happen at the earlier persisted protocol fence, before the + cluster-version fence. A completed task row can survive until the existing + HAKeeper GC cycle; teardown verifies terminal state before waiting for actual + zero rows. These observations are retained, not reported as product CI failures. + +The final-head remote CI and external re-review remain separate. These native +cases cover one pinned old revision and one local topology, with deterministic +before/after-commit injection. They do not claim all release pairs, arbitrary +network partitions/WAL failures, operator downgrade preflight, scale, cold-cache +latency or current-head speedup against StarRocks. No Request changes is +dismissed by the author and the PR is not merged by this follow-up. + + +## Covered bridge consumer and license-only follow-up + +Exact a9bff0c9 SCA evidence identifies one invalid Apache notice before analyzer +execution; expand that comment and verify the changed path with the same +license-eye policy (one valid, zero invalid). No executable initializer bytes +or build tags change. The native recovery capture is reused by exact production +source equality and exact equality from the initializer's build tag onward; +the original source hashes remain labeled with their capture revision. + +The new bridge package otherwise contributes zero-hit UT blocks. Reuse the +existing native BVT deployment to validate its actual JSON stream contract, +SQL NULL/empty distinction, DSN failure, Exec/Query errors and session lifetime. +Two independent bridge processes each handle nine requests; only connection- +local state changes. The shell owns the temporary binaries, clears stale probe +reports, verifies publication and collects coverage through the existing owner. +This adds no cluster, production state or coverage-policy exception. Bridge +coverage is 28/32 blocks; aggregate coverage remains a separate remote gate. +Full-entry consumer evidence is retained separately, including repeated native +checks and independent teardown. No additional kernel/race suite is required +for Python/shell checks and an unchanged Go initializer body; normal Go/race +proofs remain valid for their unchanged semantic inputs. + + +Final covered-consumer validation passes the exact immutable entry script twice +on the same two-CN native instance: each run has 2 x 9 bridge requests and +70 functional + 5 failure + 9 cross-CN checks. Independent post-run database, +definition, dependency, run and task counts are zero before repetition. All +owned services exit. `materialized_view_ci_bridge_results.json` retains both +runs, exact changed input hashes, license proof and component coverage. The +production Go service/bridge inputs are unchanged from the 12-case capture; +only the startup initializer license comment changes. Final-head remote SCA, +UT, coverage and BVT remain required separately. + + +## Mixed-version task metadata: first-publisher correction + +The old native log exposed an omitted contract: the old CN claimed executor 17 +while catalog migration was blocked. The old 12-case result is superseded, not +reused as proof of task exclusion. The current 13-case suite observes the real +admission attempt and zero cron/async metadata, before proving normal task +execution and same-run replay after upgrade. + +R3 ownership: MV service owns the catalog/protocol admission and task-service +publication; CN stopper retains the same 30-second attempt/10-second retry and +shutdown authority. The shared retry function accepts the create operation for +two existing consumers, so MV admission and task-store errors have one lifetime; +lineage GC's operation and identities are unchanged. No per-row work, new worker, +state map or unbounded admission is added. Catalog queries and one existing +inventory check run only during bounded startup registration attempts. + +Eight cheap component cases cover ready/missing/partial/error catalogs, +old/empty/error protocol inventory and task-store failure. The channel-driven +retry test retains system-account assertions and proves both admission and +store failures before success. Both roots pass 100 exact-name race repetitions, +and both owning packages pass normally and under race. Vet/lint/builds pass. +A local author-set memory limit conflicted with an unrelated default-limit +assertion; removing that execution-only override restores the full CN race pass +without changing any test assertion. Native 13/13 passes with exact frozen input +identity and normal authentication. The full existing two-CN BVT consumer is +validated independently against the new production build. + + +Final post-admission production-consumer proof: the exact entry passes twice +on the same two-CN instance, each with 18 bridge requests and 70 functional, +5 failure and 9 cross-CN checks. Independent cleanup counts are zero after +each run and all services exit. Bridge counters remain 28/32 blocks; no +coverage-policy change. All 11,042 frozen inputs match. The new source/result +ledger supersedes the earlier consumer-only capture. Final-head remote CI +remains separate. + + +## Upstream protocol 117 allocation collision + +While cd5de147 ALL CI was running, upstream main 9f873692e0 added protocol +117 for collation-aware LEAST/GREATEST semantics and made this PR conflict. +Retain upstream's 117 contract and allocate 118 to native MVs across the +4.0.15 migration, coordinator publication, frontend DDL, plan authoring and +compile registration/scan consumers. A 117 node is the nearest unsupported +MV consumer even though its collation feature is supported. Catalog version +4.0.15, task executor 17, retry ownership and feature scope do not change. +The combined parser is regenerated from grammar; its one changed action +preserves upstream COLLATE expression nodes. + +R3 compatibility closure: typed tests reject MV protocol/floor 117 and admit +118 while ordinary scans and collation's 117 contract retain their controls. +Reuse the native destructive driver with a clean real upstream 117 binary +and verify its actual protocol inventory via normal authenticated SQL. This +changes no concurrency primitive, state owner or hot path; previous race +proof remains evidence for those unchanged mechanisms. Final normal suites, +static checks, new binaries and native/BVT results are recorded separately. +Pre-merge 117 captures remain historical evidence for their source, not the +new allocation. The old cd5 CI cannot establish the subsequent merge head. + + +Final protocol-118 validation: eight complete owning suites pass (defines, +4.0.15, MV, frontend, plan, compile, mysql parser and CN); upstream 117 +collation controls in function/PB plan pass. Six-package vet and configured +incremental lint pass with zero issues. Clean real upstream 117 and tagged/ +normal 118 service builds succeed. The native run passes 13/13 groups in +324.495 seconds, including actual 117 inventory, no premature catalog/tasks, +interrupted/repeated upgrade, 118-vs-117 downgrade refusal and both commit/ack +crash windows. Its committed JSON includes the upgrade wait stack and native +protocol/admission diagnostic excerpts, not only local filesystem references. + +The exact covered BVT entry passes twice on the same two-CN production +instance: each has 18 bridge requests plus 70/5/9 functional/failure/cross-CN +checks, independent zero cleanup counts, and all service processes reaped. +Bridge component counters are 28/32 regions and 50/56 statements; aggregate +coverage is a separate remote gate. All 11,061 frozen tracked non-documentation +inputs match. Pre-delivery new binaries report cd5de147 with modified=true; +the real upstream old binary reports clean 9f873692. + +One focused local link attempt exhausted the author cache disk. Old generated +cache entries were removed while protecting active import inputs, then full +owning suites passed; no source/assertion workaround was made. The cd5 remote +SCA/coverage-UT/Proxy results passed before this merge, but cannot establish +its final-head CI. Whitespace checking uses upstream as the delta base; main's +existing trailing-space CHAR collation golden values are preserved unchanged. + +The combined EXPLAIN consumer suite also passes (0.326 s), with its own +vet and configured incremental lint reporting zero issues. This closes the +additional auto-merged test consumer without changing source or existing +semantic input fingerprints. diff --git a/docs/design/materialized_view_reference_manifest.json b/docs/design/materialized_view_reference_manifest.json new file mode 100644 index 0000000000000..9115ecb734e19 --- /dev/null +++ b/docs/design/materialized_view_reference_manifest.json @@ -0,0 +1,84 @@ +{ + "design_revision": 2, + "matrixone": { + "head": "dd38098853ea197699ed3fac3e69dc53975ac061", + "branch": "work", + "worktree_clean_at_task_start": true, + "local_base": "23d8f61252f3017dff218b530817a240206fd762", + "remote_freshness": "not fetched; local base only" + }, + "starrocks": { + "repository": "StarRocks/starrocks", + "ref": "3.5.7", + "files": [ + { + "path": "fe/fe-core/src/main/java/com/starrocks/catalog/MaterializedView.java", + "blob_sha": "410f549902e82b0fffac7ee144c64f3b9aaea620", + "url": "https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/catalog/MaterializedView.java", + "lines": 2420 + }, + { + "path": "fe/fe-core/src/main/java/com/starrocks/scheduler/PartitionBasedMvRefreshProcessor.java", + "blob_sha": "02a6cf4240f74ce8d944a13cdef92ad3eec7361c", + "url": "https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/scheduler/PartitionBasedMvRefreshProcessor.java", + "lines": 1435 + }, + { + "path": "fe/fe-core/src/main/java/com/starrocks/scheduler/mv/MVVersionManager.java", + "blob_sha": "6888f4d73a8d45d81defc1536bf887b7e44a82e2", + "url": "https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/scheduler/mv/MVVersionManager.java", + "lines": 275 + }, + { + "path": "fe/fe-core/src/main/java/com/starrocks/sql/optimizer/MvRewritePreprocessor.java", + "blob_sha": "d01dc156cc0e228d08154cd8c2c773b52d41ec21", + "url": "https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/MvRewritePreprocessor.java", + "lines": 1066 + }, + { + "path": "fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rule/transformation/materialization/AggregatedMaterializedViewRewriter.java", + "blob_sha": "8930d92ad3a292e78d5f18a8ad2f1aec0270bb3c", + "url": "https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rule/transformation/materialization/AggregatedMaterializedViewRewriter.java", + "lines": 866 + }, + { + "path": "fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rule/transformation/materialization/MaterializedViewRewriter.java", + "blob_sha": "3e3103db0437b4df93db69951d818b64956fb98f", + "url": "https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rule/transformation/materialization/MaterializedViewRewriter.java", + "lines": 3076 + }, + { + "path": "fe/fe-core/src/main/java/com/starrocks/sql/analyzer/MaterializedViewAnalyzer.java", + "blob_sha": "562d527a8e2a9831faa069b4a3eac3d69095e969", + "url": "https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/sql/analyzer/MaterializedViewAnalyzer.java", + "lines": 2079 + }, + { + "path": "fe/fe-core/src/main/java/com/starrocks/scheduler/TaskBuilder.java", + "blob_sha": "92ee65f46bafa57c92fa2c3bbfa15c8148b23471", + "url": "https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/scheduler/TaskBuilder.java", + "lines": 288 + } + ] + }, + "delivery": "Experimental P1 implemented and locally validated on the original baseline; publication verification is recorded separately.", + "git4data_sources": [ + "pkg/frontend/snapshot.go", + "pkg/frontend/databranchutils/lineage_publication_lock.go", + "pkg/frontend/databranchutils/branch_protect_snapshot.go", + "pkg/frontend/data_branch_hashdiff.go" + ], + "publication": { + "repository": "matrixorigin/matrixone", + "issue": 30079, + "base": "3e50e1b32d8da61bbbf70c89989fb08b671809de", + "branch": "feat/materialized-views-p1-20261013", + "base_freshness": "origin/main fetched and verified on 2026-10-13", + "protocol_floor": 112, + "prototype_protocol_floor": 110, + "head_repository": "dengn/matrixone", + "pull_request": 30085, + "source_commit": "f9cf6f1bd638d482e4361d7272cde94488fe98d2", + "state": "draft" + } +} diff --git a/docs/design/materialized_view_results.md b/docs/design/materialized_view_results.md new file mode 100644 index 0000000000000..081b3b87d8d5c --- /dev/null +++ b/docs/design/materialized_view_results.md @@ -0,0 +1,105 @@ +# Materialized view implementation validation + +Validated on 2026-10-13 against the local task worktree based on +`dd38098853ea197699ed3fac3e69dc53975ac061`. Go 1.27.1, Linux amd64, +4 CPU quota, 16 GiB memory, one local CN/TN/LOG deployment with native disk +storage for correctness, restart and performance; a second CN joined the same +TN/LOG/storage for the topology checks. The implementation remains experimental +and disabled by default. + +## Executed behavior + +- 66 main SQL checks passed, including scheduled refresh, exact numeric/NULL + oracles, empty aggregates, joins, projection/filter, repeated refresh, read-only + and dependency guards, SQL mode/fixed timezone, prepared queries, revoked + source permissions, owner checks, concurrent readers/publishers and tenant isolation. +- Three checks after a graceful stop/restart passed: stored materialization, + persisted history and a new refresh. +- Five native failure/cleanup checks passed: bigint overflow aborts refresh, + last-good rows remain, failure history is recorded, drop removes metadata, + and dependency cleanup permits dropping the database. +- Nine two-CN checks passed: deferred population rejection, publication + visibility, independent second-CN refresh, five rounds of simultaneous refresh + with coherent results/stable IDs/nonregressing source timestamps, and terminal + history. Conflicts may reject one concurrent request with native w-w conflict; + at least one publisher must succeed and both nodes must see the complete result. +- In total, 83 SQL checks passed. Focused tests passed 22 top-level tests and + 65 subcases across ten packages. Six relevant package suites passed in full. + Targeted race tests ran 100 repetitions; the three changed task/failure tests + each passed a separate exact-name, 100-repeat race run at delivery. + Incremental vet, build, formatting and diff checks passed. + +The startup tests discovered nested statement ownership, task ID width and +missing background transaction deadlines. They also found failed DROP DATABASE +cleared the session's database and general tenant initialization attempted to +recreate global catalogs. These paths were fixed, with regression coverage. + +## Performance + +Deterministic one-million-row fact table; 128-group first materialization. +Each scenario uses the same binary, account and committed source data, fully +retrieves results, verifies equality, warms both queries and alternates 50 pairs. +The median averages the two central observations. Initial CLI output used the +upper central observation; the accompanying JSON preserves all raw samples and +records the corrected median method. No timing samples were replaced. + +| Scenario | Raw median ms | MV median ms | Ratio | Full refresh ms | +|---|---:|---:|---:|---:| +| B01 grouped aggregation | 27.647 | 3.724 | 7.43× | 151.270 | +| B02 explicit rollup | 29.392 | 3.308 | 8.89× | 0.000 | +| B03 repeated join | 18.910 | 3.530 | 5.36× | 40.947 | +| B05 high cardinality control | 16.352 | 15.749 | 1.04× | 34.560 | + +The rollup uses the existing summary; its refresh column is zero because no +additional view was built. The join materializes eight groups over one million +facts and a 128-row dimension. The high-cardinality control has 10,000 groups +from 10,000 qualifying facts and shows little benefit. These are explicit MV +queries: transparent optimizer rewrite is not implemented. + +Raw observations and plans: [materialized_view_performance_results.json](materialized_view_performance_results.json). +Runner: [test/materialized_view](../../test/materialized_view/README.md). +Case-level behavior evidence: [materialized_view_behavior_results.json](materialized_view_behavior_results.json). +Runtime logs and original main/restart/failure/two-CN JSON are in `/workspace/mv-build`. +Change map and verification boundaries: [materialized_view_self_review.md](materialized_view_self_review.md). + +The implementation reuses MO transaction snapshot timestamps and physical/logical +source identities as version provenance. This is the foundation for using +Git4Data semantics; branch-aware refresh, historical MV reads and incremental +change extraction are future work. + +## Limits + +This proves the documented experimental full-refresh scope on a local +cluster, with a bounded two-CN publication check. It does not establish production-tail, cold-cache, +mixed-version/downgrade, crash-at-commit or large-scale scheduler behavior. +B04 and B06–B08 remain broader workload experiments. Logical MV clone/restore, +historical MV reads, incremental refresh and automatic query rewrite reject or +remain outside this phase. Configured golangci-lint was unavailable; incremental +vet is not a claim that the full lint pipeline passed. + +## Publication validation — 2026-10-13 + +The publication branch is based on freshly fetched main +`3e50e1b32d8da61bbbf70c89989fb08b671809de`. Main already reserves protocols 110 +and 111, so the MV protocol floor is now 112. The original observations above +retain their original baseline; they are not relabeled as new-head results. + +New-base verification passed 22 focused top-level tests / 66 subcases, the six +owning package suites, native library/service/runner builds, and configured +incremental golangci-lint 2.14.0 with zero issues. The extra protocol case proves +that authoring floor 111 cannot admit the new relation. Results and scope: +[materialized_view_publication_results.json](materialized_view_publication_results.json). + +The final native run passed **84 SQL checks**: 67 main, three after graceful +restart, five native failure/cleanup and nine two-CN checks. Prepared and +authorized reads now retrieve/compare all rows and check terminal stream errors; +the cancellation assertion checks the actual context error. An added escaped +source-name case reproduced a refresh failure under NO_BACKSLASH_ESCAPES. The +fix keeps metadata SQL on its own default parser/literal rules while applying +captured mode/timezone only to persisted source SQL. The native reproducer and +new case passed after the fix; source identity and schema checks remain enabled. + +Publication timing samples are retained as diagnostics because lint/race build +work ran concurrently. Use the separately recorded prototype measurements above +for the isolated warm-query comparison. Full CI and the remaining production +release gates are still pending; publication is a Draft PR under issue #30079. diff --git a/docs/design/materialized_view_review_lifecycle_results.json b/docs/design/materialized_view_review_lifecycle_results.json new file mode 100644 index 0000000000000..ae9eb66421b70 --- /dev/null +++ b/docs/design/materialized_view_review_lifecycle_results.json @@ -0,0 +1,101 @@ +{ + "reviewed_head": "15ef9e056fc44a076fd548a93403d40ecfff58b8", + "review_scope": "Three integration defects and revision-3 database/account lifecycle decision; published RFC and external re-review remain separate from author validation.", + "native_contracts": { + "functional": 70, + "failure": 5, + "multi-cn": 9 + }, + "functional_source_rows": 0, + "functional_wall_seconds": 208.264, + "normal_sql_bvt": { + "total": 58, + "passed": 58, + "failed": 0, + "ignored": 0 + }, + "owning_package_tests": [ + { + "log": "review-lifecycle-owning-network.jsonl", + "package": "github.com/matrixorigin/matrixone/pkg/sql/compile", + "result": "pass", + "seconds": 9.07 + }, + { + "log": "review-lifecycle-owning-network.jsonl", + "package": "github.com/matrixorigin/matrixone/pkg/frontend", + "result": "pass", + "seconds": 25.296 + }, + { + "log": "review-lifecycle-final-owning.jsonl", + "package": "github.com/matrixorigin/matrixone/pkg/mv", + "result": "pass", + "seconds": 0.066 + }, + { + "log": "review-lifecycle-final-owning.jsonl", + "package": "github.com/matrixorigin/matrixone/pkg/frontend", + "result": "pass", + "seconds": 24.431 + }, + { + "log": "review-lifecycle-delivery-frontend.jsonl", + "package": "github.com/matrixorigin/matrixone/pkg/frontend", + "result": "pass", + "seconds": 23.609 + } + ], + "vet": "pass", + "configured_lint_issues": 0, + "pre_migration": { + "receipt": { + "auto_upgrade": false, + "mv_catalogs": 0, + "state": 2, + "version": "4.0.14", + "version_offset": 1 + }, + "bootstrap_source": "fcad62a8ff06000e682824802f1155cbeea02a2f (pre-feature main; buildvcs=false for Git archive)", + "before_error": "alter table mv_validation_pre_migration.facts add column extra int: Error 1146 (42S02): SQL parser error: table \"mo_mv_dependencies\" does not exist", + "after": { + "pessimistic": [ + "ordinary ALTER before MV migration", + "ordinary CREATE INDEX before MV migration", + "ordinary DROP INDEX before MV migration", + "ordinary TRUNCATE before MV migration", + "ordinary DROP TABLE before MV migration", + "ordinary DROP DATABASE before MV migration" + ], + "optimistic": [ + "ordinary ALTER before MV migration", + "ordinary CREATE INDEX before MV migration", + "ordinary DROP INDEX before MV migration", + "ordinary TRUNCATE before MV migration", + "ordinary DROP TABLE before MV migration", + "ordinary DROP DATABASE before MV migration" + ] + }, + "kernel_session_scope": "Only the separate 4.0.14 fixture sets skipCheckUser=true to bypass an earlier tenant-version admission fence. Privilege checks remain enabled, automatic upgrade remains false, no system schema/version rows were edited. Main two-CN account/ACL regressions use normal authentication.", + "standard_login_control": "Error 1815 (HY000): invalid state tenant upgrade requires current cn version 4.0.15 to match cluster latest version 4.0.14", + "not_claimed": "Normal fresh-login/mixed-version compatibility across 4.0.14/4.0.15 is not established by this kernel fixture." + }, + "source_sha256": { + "pkg/mv/service.go": "7db13c2f954f16d52196720b30cfd58b04caf68c3b81d62db5a0204ae8ad63f3", + "pkg/sql/compile/materialized_view.go": "16c91fda1889016cbdc55b0e89d122d0fef61d29289d70d0a02abdf02eb0c87d", + "pkg/frontend/authenticate.go": "910d593e525e8a00fdf30a991dcfed96f9010a5f3f1c65cbb6a6f3c5eab00e4a", + "pkg/frontend/materialized_view.go": "8ed6a137646c9865102045cac905c9f89d1098fd44312361eba196483cba4a8b", + "pkg/frontend/internal_executor.go": "233d2e0dbe39060524201d0fd9bf53e8c0d1ecbc8311b07778df4bc464ec3e12", + "test/materialized_view/additional.go": "4dd4c494998f4e1d8243f124a57cdfdb8106cfdbb15ce25b79c367c192078f71", + "test/materialized_view/catalog.go": "30b92c170f2f40689ea4a678361f452296e1d8625efa0d1078c9c30189b28645" + }, + "report_sha256": { + "functional": "93d1a2331ce229f1099370c0229b1b4628d0be5616fc21211609f73bb8d20427", + "failure": "62008676c98541e5938f0ccee6b2d8fde5de62be978e5fc345b1036afb9f8303", + "multi-cn": "f0c5e5ca8faa5be11cf6d26d0220fb5e5224bcdf1fb605d5cb7f5e542125cb22" + }, + "native_binary_sha256": "5b21a20b2f7ddc332ff5727aeb76dfd0a2f40c75256974c2efc51adf85a46a3e", + "native_input_equivalence": "The native service predates only the final accessor refactor: materializedViewRetirementTxnID delegates to existing backgroundExecTxnOperator, which selects the identical backSession transaction and ID for valid account-drop executors. All other production inputs are unchanged. Final frontend UT and static checks cover the delivered accessor; native evidence is explicitly reused by this semantic equivalence, not relabeled as a byte-identical source build.", + "scheduler_oracle": "Real reconciler; durable typed run history plus Completed queue state or taskService completed-task GC. No product hooks, new retries, skip/assertion/coverage-policy changes.", + "coverage_scope": "Local service is not coverage-instrumented. Client counters are diagnostic only. Previous head CI passed; new-head CI must run independently." +} diff --git a/docs/design/materialized_view_self_review.md b/docs/design/materialized_view_self_review.md new file mode 100644 index 0000000000000..83fb8064e21b3 --- /dev/null +++ b/docs/design/materialized_view_self_review.md @@ -0,0 +1,353 @@ +# Experimental materialized-view delivery review + +Review date: 2026-10-13. Scope is the local task delta against explicit task-start +HEAD `dd38098853ea197699ed3fac3e69dc53975ac061` on branch `work`: +33 modified tracked files and 32 new files, no staged changes. No commit, push or +PR was created. The branch contains substantial pre-existing committed work; +it is excluded from this delivery scope. Remote default-branch freshness was +not re-established, so this is not a review of the entire branch for merging. + +The user approved design revision 2 with “去实现吧” and subsequently requested +additional validation cases. The implementation follows the experimental P1 +full-refresh scope; P2 rewrite and P3 incremental refresh remain separate. +StarRocks reference provenance is recorded in the source manifest. + +## Change and risk map + +| Closure / files | Invariant, owner and consumers | Risk and evidence | +|---|---|---| +| SQL admission: parser grammar/keywords/generated parser, new tree AST, plan materialized_view, build/query/constraint/DDL/DML/show/clone hooks | Distinct read-only relation; deterministic bounded native-table query; dependency capture before optimization/expansion; persistent identity; gate/protocol admission. Consumers are native CTAS relation creation, SELECT/DML/DDL binders and compile. | R2/R3: parser/full suite and plan contract/creation/catalog tests; real deferred/empty/NULL/join/duplicate/unsupported query tests. Generated parser derives from grammar; generation reported zero conflicts. | +| Catalog/protocol/upgrade: new catalog definition/tests, defines const, bootstrap upgrade and v4_0_15 | Account-qualified global metadata, immutable format-1 definition, stable physical/logical IDs and schema version. Creation/bootstrap and restart readers agree; protocol 110 required. | R3 compatibility: catalog decode/DDL tests, upgrade handler tests, fresh native initialization, tenant initialization and physical restart. Mixed-version migration/downgrade not executed. | +| Frontend authorization/dispatch: materialized_view, authenticate, executor/self_handle/status/stmt_kind/variables, snapshot/PITR guards | Owner/admin writes, MV plus source SELECT for reads, live definer identity/role/ACL for tasks, account isolation, no active user transaction; unsupported logical clone/restore reject. DROP failure preserves session DB. | R3 security: privilege/global ownership/transaction tests; real revoked-source, owner, SHOW and two-account cases; failed DROP regression. Logical restore rejection is source-reviewed, not an end-to-end restore claim. | +| Refresh transaction: mv service, compile materialized_view and DDL/scan/DML/scheduler/sql_executor hooks, defines capability, executor parser mode | Intent precedes publication; stored data, coverage and success history commit in one SI transaction. Exact account/table/transaction capability; current-CN writes; source identity and snapshot checked; sequence/epoch fencing. | R3 state/concurrency: failure injection at transaction boundaries, snapshot drift, stale task, lost commit response, transient retry, exact capability and nested statement tests. Native overflow rollback, restart, concurrent readers and two-CN publishers passed. | +| Scheduler/lifecycle: mv task, CN service/task wiring, task proto/generated code | Shared periodic reconciliation; stable run identity; queue identity fits existing VARCHAR(50); bounded retries/deadlines; live definer admission and stale epoch handling; bounded history pages. Existing CN stopper owns cron registration. | R3 liveness/recovery: exact task/reconcile/failure race repeats, full mv suite, native scheduled refresh, terminal two-CN history. Large-scale scheduler and process crash at commit remain release validation gaps. Generated task enum aligned with proto. | +| Resource control: defines output budget, insert/multi_update writers and tests | Fixed admission buckets/capacity; cancellation releases every acquired slot; two active refreshes/CN; shared 512 MiB inserted-batch quota charged on local and S3 paths. Every successful executor result is closed. | R3 bounds/resources: admission/counter/writer tests and race repeats, memory-pool cleanup assertions, failure cleanup deadline. Quota bounds output batches, not total query working memory or storage capacity. | +| Public validation/delivery: test/materialized_view, RFC, reference manifest, case inventory, behavior/performance results, this review | Independent numeric/NULL oracle, same-source full-result comparison, native server rejection rather than transport failure, scoped fixtures, reproducible paired measurements and honest phase boundaries. | R2/R3: 83 native SQL checks, 50 alternating pairs per measured workload, EXPLAIN and raw observations retained, harness vet/build, formatting and diff checks. B04/B06–B08 remain unexecuted. | + +Correctness, consumer contracts, compatibility/security, performance/operations, +platform/delivery and test architecture apply to all executable closures above. +State/concurrency, liveness, resource lifecycle and boundedness apply to refresh, +catalog fencing, scheduler and writer closures and are covered by their listed +proofs. Pure documentation has no runtime owner, wait, allocation or wire format; +its applicable lenses are evidence accuracy, provenance and delivery. + +## Ownership, waiting and growth + +- Q1: refresh owns its cancellation, acquired admission slots and executor + results; defers release on success and rejection. Native transaction execution + owns commit/rollback. Diagnostic cleanup has a separate bounded context and + does not publish data. CN stopper owns registration retries. +- Q2: account/global admission waits select cancellation; refresh/task execution + has a 300-second deadline, state reads 30 seconds, diagnostic cleanup 5 seconds, + and registration attempts 30 seconds. Transaction retry is at most three + attempts. No new unbounded application wait or SQL-originated capability exists. +- Q3: 256 fixed account buckets, two pending per bucket, two active refreshes/CN, + 128 views/account, 16 sources, 256 columns, 64 KiB query and 512 MiB output-batch + quota. Discovery pages have 128 rows; history visits 16 views and at most two + 128-ID pages each. The 100-run/7-day history policy is periodic retention, + not an instantaneous global cardinality bound. + +Cross-CN publication linearizes at the metadata/data transaction commit. A +conflicting attempt retries or fails with native w-w conflict; a superseded +sequence cannot replace a newer publication. Source IDs and schema versions +prevent rebinding a recreated name. Schedule epochs and stable background run +IDs prevent stale-policy publication and duplicate task replay. + +## Validated evidence and decision + +- `delivery-focused.log`: 22 top-level tests, 65 subcases, ten packages passed. +- `owning-delivery.log`: catalog, mv, v4_0_15, MySQL parser, insert and multi_update + full package suites passed after the runtime fixes. +- Delivery race JSON: each of task identity, reconciliation identity and refresh + failure boundaries ran separately with `-race -count=100` and an anchored exact + test name. Earlier counter/admission/timezone race evidence remains valid. +- Incremental production vet (`vet-delivery.log`) and harness vet passed. + Native service and SQL harness built. Formatting and `git diff --check` passed. + Configured golangci-lint was unavailable; no full-lint or full-repository test + success is asserted. +- Native behavior: 66 main checks, three graceful restart checks, five overflow + failure/cleanup checks and nine two-CN checks passed. Task-owned SQL fixtures + were removed. Case-level evidence and original-file hashes are checked in. +- Performance: B01/B02/B03/B05 each retained 50 paired observations, verified all + result rows and saved EXPLAIN. Timing was single-CN; topology tests were run + afterwards. The median correction preserves original observations and records + the method. High-cardinality results show little improvement. + +Local experimental P1 implementation and its documented validation are complete. +There is no observed unresolved failure in the executed scope. A production +release/merge recommendation remains pending mixed-version migration/downgrade, +crash-at-commit, cold-cache/tail and larger scheduler validation, and configured +lint/full release checks. These gates are explicit, not treated as passing or +waived. Logical MV clone/restore, historical reads, branch-aware refresh, +incremental maintenance and automatic rewrite remain outside P1. + +The runtime production evidence uses the final production semantic inputs; +subsequent edits add harness topology checks and documentation only. Build/test +logs are retained in `/workspace/mv-build`. The checked-in execution report and +JSON provide the durable case and measurement record. + +## Publication review — 2026-10-13 + +This follow-up review uses the fresh explicit PR base +`3e50e1b32d8da61bbbf70c89989fb08b671809de`, verified by fetching origin/main. +The original HEAD is its ancestor (64 upstream commits); all original feature +changes were applied in a separate worktree. The publication delta is 66 files: +33 modified existing files and 33 additions, including one new publication +evidence JSON. The map above covers the same behavioral closures. + +The three integration conflicts preserve upstream CDC runtime initialization, +variadic DROP lifecycle admission and the planner's three-result table binding. +Protocol 110/111 are preserved; MV authoring/reading now requires 112. An extra +test rejects authoring floor 111. Generated parser output was regenerated from +the merged grammar. No unrelated upstream commits are included in the PR delta. + +Final new-base evidence: + +- 22 focused top-level tests / 66 subcases and the six owning package suites + passed; the complete mv suite passed again after the context isolation fix. +- Native library, service and validation runner built. Configured incremental + golangci-lint 2.14.0 passed with zero issues across the changed package closure. + It found missing complete stream/error/cleanup checks in the runner; these + were fixed and rerun, including prepared-result equality and typed cancellation. +- An escaped source name under NO_BACKSLASH_ESCAPES failed before the fix and + passed after it. Metadata keeps its default parser/literal rules; persisted + source SQL alone inherits authoring mode/timezone. The three captured-context + subcases passed 100 exact-name race repetitions after the fix. +- 84 native SQL checks passed: 67 main, 3 graceful restart, 5 overflow/cleanup, + 9 two-CN. Fixture cleanup completed. Their original hashes, case lists and raw + result documents are in `materialized_view_publication_results.json`. +- Publication timing samples ran alongside lint/race build work and are retained + as diagnostics. The isolated prototype measurement artifact is not overwritten + or promoted to new-base measurement evidence. + +The local implementation/evidence blockers found in publication preparation are +closed. Issue #30079 and the Draft PR are the review vehicle for the experimental +P1 scope. The production release gates listed above remain pending; draft +publication is not production approval, a full CI pass or closure of P1.1/P2/P3. +The initial review's statements about an unpublished worktree and unavailable +lint refer to that earlier review; this section supersedes them for publication. + +Published implementation source commit: +`f9cf6f1bd638d482e4361d7272cde94488fe98d2`. Draft implementation PR: +[#30085](https://github.com/matrixorigin/matrixone/pull/30085), linked to project +tracker [#30079](https://github.com/matrixorigin/matrixone/issues/30079). +Head repository is `dengn/matrixone`, branch +`feat/materialized-views-p1-20261013`; base is `matrixorigin/matrixone:main`. +The upstream repository rejected direct ref creation under its repository rules, +so publication follows CONTRIBUTING.md through the existing user fork. +The local link/provenance update changes documentation only. After PR creation, +the remote branch merged newer main commits `175a645a85` and `e5111936b9` via +`e2ba50650e`; this upstream integration is preserved. Original runtime/lint/race +evidence remains pinned to the verified implementation source above. Current-head +integration/CI evidence is separate and is not inferred from those earlier runs. +Post-merge focused MV tests passed in the parser, planner, frontend and compiler +packages (`post-merge-focused.log`). This verifies the affected local integration +closure; it is not a rerun of the earlier complete native SQL/performance matrix. + +## CI correction review — 2026-10-13 + +The original full CI failed at commit `417811f5949dc04c9bd6d74d624bce2b852506c2`. +Its failures are covered by [the CI triage record](materialized_view_ci_triage.md). +The review closure is restore ownership (R3), pessimistic source publication +and DDL admission (R3), cron lifecycle/retry (R2), upgrade/port fixture consumers +(R2), and license/exact catalog result fixtures (R0/R1). + +Native pessimistic source-name locks are retained through MV publication. +Dependencies are checked after the existing DDL admission frontier, preserving +Git4Data and index waiting policies. Optimistic publication still uses its +conflict fence. Cluster restore now consumes the same explicit catalog skip +policy as bulk copy; the typed negative control still drops a user cluster +table. MV and lineage registration have independent stopper-owned retries. +Existing cancellation tests exercise their shared retry implementation. + +Focused coverage reproductions, embedded cluster counterexamples, five owning +package suites, license headers, configured incremental lint and molint passed. +The three cron cancellation/retry tests each passed 20 race-enabled repeats +(60 top-level passes, no data races). The targeted native BVT run passed all 12 failed files (2,741 executed +statements); 67 main MV checks and nine cross-CN checks passed. New full CI must +be reported separately at the corrected head. Draft status and the previously documented production-release +proof gaps remain in force; no CI green or new speedup is inferred from local +checks. + + +The follow-up SCA failure at `7b0d6f04a7` was the Makefile's independent error +constructor policy, after the complete license check passed. Catalog metadata +errors now use `moerr`, with a typed error-class oracle. The full catalog suite, +`make err-check`, and configured catalog lint passed. Earlier success-path, +restore/admission, and cron evidence is unchanged; the new full CI is pending. + + +The complete CI at `955c3f787a` passed build, arm64 SCA, full coverage UT and +PROXY BVT. Pessimistic BVT had only three missing-catalog-row result mismatches +in two additional fixtures. All eight full inventory fixtures were audited; +the two corrected files passed complete isolated mo-tester runs. This is an +R0 fixture/documentation follow-up with unchanged source behavior. Prior code +and concurrency evidence is reused; full fixture-head CI and the still-queued +ordinary UT remain explicitly pending. + + +Main merge review: `a321a75afc` + `35c8dd5854` (2026-10-13). Both text conflicts +were resolved from their owning contracts: regenerate the parser from combined +grammar; retain main's cohort port-range admission. Auto-merged frontend, planner +and compile hooks preserve MV dispatch, authorization and single-CN refresh. +The main-side JSON EXPLAIN protocol mismatch was reproduced at the clean source +baseline and fixed through the existing typed index-search/plugin boundary. +All prior distinct renderer oracles are retained using current protocol fields, +with additional malformed metadata, fulltext and opaque-options controls. Six +owning suites, 11 gossip fixture tests, seven-package configured lint and vet, +and the error-constructor policy passed. Molint exited 0 with two advisory +recover diagnostics on unchanged, checked main-side helper bodies. No new shared +state, wait, persistence format or native dependency was introduced; prior MV +race/restart proof remains valid for its unchanged contracts. Delivery review +has no unresolved blockers for this merge correction. Complete merge-head CI +and the previously recorded Draft production-release gaps remain separate. + + +Continuation review (2026-10-14): exact integration inputs `cb53485ffe` + main +`bcd4cb99e7`; ordinary compatibility/fixture corrections, approved MV design +revision unchanged. R2 renderer/grammar closure adopts main's producer/hook/BVT +contract without removing prior oracles. R3 protocol admission is closed across +planner, frontend, compile, upgrade and latest-version consumers with 112/113 +negative/control cases. R1 NULLIF and private-ledger fixtures preserve stronger +complete-state/serialization/resource oracles. R3 topology proof includes the +actual Push-mode commit handoff; it makes no global-freshness claim. Created +private generation/ledger cleanup is registered immediately and occurs after +operators/scopes finish; cleanup does not abort before releasing resources. +Eight package suites, 30 repeated root cases, refreshed configured lint/vet, +137 native BVT statements, 67 main MV checks and 180 causal two-CN checks pass. +No unresolved blocker for this correction; current-head full CI and the existing +Draft production-release gates remain separately tracked. + +Final main alignment at `f02952f7bf9c3294d5cb7876a07888d2380d48a9`: clean +merge, complete compile and plan suites pass, configured lint reports zero +issues. Both MV gates and main's ordinary-view admission are retained. One +redundant, identical empty-index early return is removed; the retained return +has the same no-op contract and owning-suite evidence is semantically valid. +Native evidence reuse is bounded to the unchanged non-ODKU/non-view-replacement +paths, as recorded in the CI triage document. No unresolved merge blocker. + +Coverage integration review (2026-10-14): head `9ffe2fb06a2e` passed all executed +functional CI producers and Connector/J; the required gate failed at 37.12% +changed-code coverage. The correction is an R1 test/runner closure: one native +SQL golden, the existing two-CN contract consumer integrated after group 0's +global restore fixtures, and 21 deterministic scheduler/retention subcases. +No production behavior, threshold, exclusions, skips, or retry policy changes. +The runner owns its temporary executable and JSON reports, reuses existing CNs, +uses direct published ports, preserves terminal failure status and validates +nonempty reports. Client counters join the existing server coverage producer +with the same mode; this avoids inventing another CI publication path. + +The native failure fixture now owns a separate database, so it runs independently +and does not delete a retained benchmark/restart fixture. Functional mode omits +all generated benchmark rows and timing experiments. Scheduled refresh retains +its existing actual-result poll and bounded 120-second deadline. UT verifies +terminal failures/replay, epoch admission, active-run protection, bounded pages, +overlap deduplication and cancellation without timers or extra services. +All 54 new SQL statements, 77 native checks, complete owning MV UT, incremental +vet/lint and shell syntax pass. A nonempty local profile reproduction reaches +793/1043 (76.03%) with the original strict >75% policy; this reuses old CI profiles +only for unchanged semantic inputs. No unresolved local correction blocker. +New-head GitHub checks and the existing Draft release-validation gaps remain +separate requirements. + +Latest-main conflict resolution (2026-10-14): main `2ce4e58af6f03b943ee288ffad81012766cf830a` +adds the upstream NULLIF assignment-skipping test correction (#30138). Its only +overlap with head `3294ed1c59` is `pkg/sql/plan/nullif_rebind_test.go`. Keep main's +case names and leading non-NULLIF control, plus the PR's assertion that every +assignment expression is consumed before serialization. All 12 external/LOAD +subcases and the real BuildPlan control pass; complete planner UT passes +(55.284 seconds), incremental vet/configured lint reports zero issues, and +format/diff checks pass. This R1 test-only merge leaves the native feature and +coverage-consumer semantic inputs unchanged. No local conflict blocker remains; +the merge commit's GitHub checks must be verified separately. + +Published-port correction review (2026-10-14): the first CI native consumer +failed before any case because Compose exposed 6002 while both CNs listened on +6001. This R1 configuration/consumer closure corrects both published targets and +the runner's target lookup, preserving dynamic host ports and the ordinary proxy +route. Old/corrected Compose-to-TOML controls distinguish the mismatch; real Docker +greetings and 77 default-discovery checks pass on distinct CNs with proxy mode +enabled, without DSN overrides, skips or retries. Shell syntax/diff checks pass; +Go/product semantic inputs are unchanged, so prior owning-UT and static evidence +remains valid. No local port-boundary blocker remains. Re-run the final head's CI; +the failed coverage prerequisite cannot be called a threshold verdict. + +Latest-main parser conflict resolution (2026-10-14): main +`fcad62a8ff06000e682824802f1155cbeea02a2f` adds parenthesized +`ALTER TABLE ADD COLUMN (...)` (#29963). The grammar merges cleanly; regenerate +`mysql_sql.go` with the repository goyacc instead of choosing either generated +file. Generation reports zero shift/reduce and zero reduce/reduce conflicts. +Retain upstream parser tests. Complete mysql parser and planner UT pass +(0.366 and 56.890 seconds), incremental vet passes, configured lint reports zero +issues. A freshly rebuilt native service passes 58/58 SQL statements with zero +ignored, failed or abnormal cases, plus all 77 native checks (63 functional, +5 rollback, 9 causal two-CN). New SQL controls reject parenthesized ADD on the +MV and its dependent source, then allow ordinary ADD after dropping the MV and +verify original rows plus NULL new columns. Port-boundary Docker proof above is +separate. This resolves the local generated-parser conflict; final-head GitHub +checks remain independent. Evidence is in `materialized_view_ci_port_results.json`. + +### Account/catalog review closure (revision 3, 2026-10-14) + +Scope: focused corrections on reviewed head `15ef9e056fc44a076fd548a93403d40ecfff58b8`; +main freshness checked at `a33dcfb2e54196e17abe21de4346200a18009d83`. The original +feature remains experimental. These fixes restore existing compatibility, +authorization and account-deletion contracts; revision 3 reconciles the lifecycle +policy rather than adding a second scheduler/cleanup mechanism. External design +and implementation re-review remain required; this author record is not approval. + +Change map: + +| Closure | Owner/consumer | Risk and evidence | +| --- | --- | --- | +| Catalog readiness | MV catalog helper, both compile DDL guards, account owner | R3 migration boundary; zero/partial/full/error UT; table/database controls in both modes; real isolated 4.0.14 kernel before/after controls | +| Background account admission | InternalExecutor session constructor/overrides, frontend definer check, task consumer | R3 tenant boundary; context/base/command/system account identity, inactive/missing account controls; real suspension/restriction and reopening | +| Account retirement | Existing DROP ACCOUNT transaction, bounded native MV drop, dependency/state/history/task cleanup | R3 transactional lifecycle; exact account/table/txn capability, per-step failures; real rollback after first native drop, surviving populated/periodic MVs, obsolete task admission | +| RFC/acceptance/harness | Revision-3 DB RESTRICT versus account retirement policy and named cases | R0/R2 alignment; explicit ownership/ordering/rollback and evidence boundaries | + +The account retirement loop is bounded by the existing 128-MV limit and stable +mv_id order. It reuses compiler lifecycle admission and the existing account +transaction; any lock/conflict/cancellation or later cleanup error rolls back the +whole deletion. No generic database bypass, account-wide writer capability, +background cache, new retry layer, or feature/coverage skip is added. MV creation +conflicts through the account fence; admitted refresh publication conflicts on +the definition row updated/deleted by retirement. The existing epoch/publication +UT and two-CN publication evidence apply, plus new retired-definition admission. +Per-session identity initialization introduces no new Go shared state; database +transaction ordering is validated by rollback/epoch/real-consumer controls rather +than treating a Go race run as proof of database serialization. + +Complete owning MV/compile/frontend suites pass; delivery frontend UT passes +again after the accessor-only reuse of backgroundExecTxnOperator. Incremental +vet and configured lint pass with zero issues. All 58 normal SQL BVT statements +pass, with zero ignored/failed. The full native CI entry passes **84 checks**: +70 functional, 5 native failure/rollback, 9 two-CN publication. The functional +fixture uses the same two tenants as the previous suite, adds two small periodic +MVs and four real status-boundary dispatches, without extra processes or large +data. It waits for durable typed history plus queue completion or completed-task +GC so bounded old retries cannot overwrite the next due-time fixture. Native +functional wall time and case/report/source hashes are recorded in +`materialized_view_review_lifecycle_results.json`. + +The separate old-catalog fixture was bootstrapped from main `fcad62a8ff06`; it +remains 4.0.14 (offset 1/state 2), with auto-upgrade disabled and all four MV tables +absent. Standard fresh login rejects at the earlier tenant-version fence. Only +this isolated kernel fixture sets skipCheckUser=true, retaining privilege checks, +to reach ordinary DDL guards. Pre-fix ALTER fails with missing mo_mv_dependencies; +post-fix ALTER, CREATE/DROP INDEX, TRUNCATE, DROP TABLE and DROP DATABASE pass in +both pessimistic and optimistic modes (six each). No system schema or version row +was edited. This is native kernel guard evidence, not normal-login/mixed-version +compatibility. Main account/ACL regressions use normal authentication. + +The service binary precedes only the final accessor refactor: its previous direct +backSession transaction lookup and the existing helper resolve the same operator +and ID for valid account-drop executors. All other production inputs are unchanged; +final owning/static checks cover the delivered accessor. This semantic reuse is +explicitly distinguished from byte-identical source evidence. Earlier failed +probes (protected system DDL, direct task-table insertion, early login fencing, +interrupted environment/sandbox and queue-GC assumptions) are not passes. Latest +head CI is still independently required; the local native service is not coverage +instrumented, and no new changed-code coverage percentage is claimed. + +No unresolved local correction blocker remains. Remaining release gates and +external revision-3 review are unchanged. diff --git a/docs/design/materialized_view_semantic_context_v2.md b/docs/design/materialized_view_semantic_context_v2.md new file mode 100644 index 0000000000000..9beb75750bc72 --- /dev/null +++ b/docs/design/materialized_view_semantic_context_v2.md @@ -0,0 +1,43 @@ +# Native materialized-view semantic context, revision 2 + +Maintenance source: 4a5fb3fd89df9037db5bc76d0b06b27f93a63ada. +Integration target: 3fc00709eccc277c175c7a09eed2605ca1aaee29. +The required gpt-6.1-sol/xhigh design gate approved this bounded correction. +Historical evidence documents retain their original revisions and topologies. + +Immutable catalog MVDefinition remains the source-query semantics owner. New +format 2 definitions persist an explicitly present division precision (0..30), +full SQL mode including empty mode, and portable named timezone rules or an +explicit fixed offset. Binding and refresh use the existing resolver/context +owners; internal executor forwarding includes sql_mode, preserving frontend +precedence, scope and detached defaults. Named-zone load failure rejects refresh; +rule-bearing Local without a portable identity rejects creation. No general +session snapshot or parallel resolver is introduced. + +Format 1 remains readable for stored rows, SHOW, disabling policies and cleanup. +Its original division precision cannot be reconstructed: refresh requires +recreation, without guessing from output scale or adopting default 4. Migration +4.0.17 pauses legacy periodic policies and advances the existing epoch so queued +work cannot refresh them. Preserve main migrations through 4.0.16 and charset +protocol118; MV authoring, scans, task registration and upgrade share protocol119. + +Preserve main's full table-definition resolution before LIMIT 0 pruning. For MV +subtrees only, the compiler's empty-result shortcut yields to its existing scan +validation; unpopulated MVs still reject, including LIMIT 0 and WHERE FALSE. +Ordinary-table shortcuts and source-privilege ownership remain intact. + +Retention keeps existing invocation bounds (16 views, two pages of128 per view), +terminal-only conditional deletion and deduplication. Count raw rows per page +across batches. Either full page schedules next_cleanup at current_timestamp; +both short pages schedule one hour later. Existing30-second reconciliation owns +retry/backoff and rotates serviced views by due timestamp. Propagate errors and +cancellation without postponing unfinished work; no new queue/cursor/worker. + +Validation must cover semantic0/4/10/30 and malformed/legacy definitions, actual +stored results and metadata under changed refresh context, populated/unpopulated +LIMIT0/WHERE FALSE, live source privileges including prepared reuse, atomic +failure preservation, dependency/teardown/reuse, bounded retention/draining and +error cancellation, migration/protocol boundaries, one race pass and configured +incremental SCA. The focused native compatibility/crash/replay workflow remains +a separate required evidence item. Local component proof does not relabel +historical old-binary/topology evidence or grant external release acceptance. diff --git a/docs/design/materialized_view_task_admission_results.json b/docs/design/materialized_view_task_admission_results.json new file mode 100644 index 0000000000000..80eb92978ca59 --- /dev/null +++ b/docs/design/materialized_view_task_admission_results.json @@ -0,0 +1,139 @@ +{ + "counterexample": { + "implementation": "a9bff0c918e835da7aab474896d0f0476ded09c1", + "native_service_sha256": "40b350b84955db699b3b0bcbe26f84b8504f2b25ad37bba67c0fd187dd4fd97c", + "old_source": "fcad62a8ff06000e682824802f1155cbeea02a2f", + "old_cn_log_excerpt": [ + { + "level": "INFO", + "time": "2026/10/16 06:29:34.311266 +0000", + "name": "cn-service.task-runner", + "caller": "taskservice/task_runner.go:397", + "msg": "new task fetched", + "uuid": "ee1dccb4-4d3c-41f8-b482-5251dc7a41bf", + "runner-id": "ee1dccb4-4d3c-41f8-b482-5251dc7a41bf", + "task": "materialized-view-reconcile-v1:1/17" + }, + { + "level": "INFO", + "time": "2026/10/16 06:29:34.311282 +0000", + "name": "cn-service.task-runner", + "caller": "taskservice/task_runner.go:434", + "msg": "task added to wait queue", + "uuid": "ee1dccb4-4d3c-41f8-b482-5251dc7a41bf", + "runner-id": "ee1dccb4-4d3c-41f8-b482-5251dc7a41bf", + "task": "materialized-view-reconcile-v1:1/17" + }, + { + "level": "ERROR", + "time": "2026/10/16 06:29:34.311338 +0000", + "caller": "taskservice/task_runner.go:690", + "msg": "error: internal error: executor with code 17 not exists" + }, + { + "level": "ERROR", + "time": "2026/10/16 06:29:34.311347 +0000", + "name": "cn-service.task-runner", + "caller": "taskservice/task_runner.go:543", + "msg": "run task failed", + "uuid": "ee1dccb4-4d3c-41f8-b482-5251dc7a41bf", + "runner-id": "ee1dccb4-4d3c-41f8-b482-5251dc7a41bf", + "task": "materialized-view-reconcile-v1:1/17", + "error": "internal error: executor with code 17 not exists" + }, + { + "level": "INFO", + "time": "2026/10/16 06:29:34.322928 +0000", + "name": "cn-service.task-runner", + "caller": "taskservice/task_runner.go:621", + "msg": "task completed", + "uuid": "ee1dccb4-4d3c-41f8-b482-5251dc7a41bf", + "runner-id": "ee1dccb4-4d3c-41f8-b482-5251dc7a41bf", + "task": "materialized-view-reconcile-v1:1/17" + } + ], + "consequence": "The old CN fetched the new reconcile task and reported executor 17 absent while MV catalog migration was blocked." + }, + "fix": { + "first_owner": "mv.Service.RegisterCron before TaskService.CreateCronTask", + "conditions": [ + "all four committed MV catalogs installed", + "existing common inventory protocol gate >=117" + ], + "retry_owner": "existing CN stopper loop, 30-second attempt and 10-second retry tick", + "lineage_gc": "same generic retry owner and unchanged metadata/expression" + }, + "native_result": { + "groups": 13, + "elapsed_seconds": 324.1111938050017, + "mixed_cron_task_count": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + ] + }, + "mixed_async_task_count": { + "attempts": 1, + "changes": [ + { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + ] + }, + "gate_attempt_observed": true, + "old_unknown_executor_log_absent": true, + "normal_publication_after_upgrade": true + }, + "source_sha256": { + "pkg/mv/task.go": "45e33412e108e5dbd71f970136c84eb705cefc2c7f54db674da11fb7b0630834", + "pkg/mv/task_test.go": "f93b3a1171c253cfb860ec4b129509f19416c28f17fefac67e8b1e5a33ef5f28", + "pkg/cnservice/server_task.go": "420d8f16e201f58a5239166dbc26306f279ee952c2bc44c453ff1803ca2e1070", + "pkg/cnservice/server_task_test.go": "2ca0fc15483d4d4bd245156c7faa342a5c32327b5ee261119fc18da18bb29f97", + "pkg/mv/service.go": "aa91a93269a8ddabb8f5c1e2de2fdf484ee0830a200ae08b537ffbdb02fe18ba", + "pkg/bootstrap/versions/v4_0_15/upgrade.go": "f1b02fc96a23c8b511aeca219e328361e3eb39adf6114646fbb0eee53ec42877", + "cmd/mo-service/materialized_view_faults.go": "8eeaece89993e635229e2b97eb68c2f55a9155f6f6b3bbe7849a0f3929b08ac4", + "optools/materialized_view_recovery.py": "7f36635de1219f084feb7da451eeb90b1d196192c1be92a5f3bddbbefcea333c", + "test/materialized_view/native_probe/main.go": "2030ccc5981c5c56b636a82ce8056e902483221411dcd60377184ee7fd1d5fee" + }, + "local_validation": { + "normal_owning_seconds": { + "mv": 0.057, + "cnservice": 8.337 + }, + "focused_race": [ + { + "test": "TestMaterializedViewCronRegistrationOwnsRetry", + "seconds": 0, + "count": 100, + "exit": 0 + }, + { + "test": "TestMaterializedViewCronAdmission", + "seconds": 0, + "count": 100, + "exit": 0 + } + ], + "race_owning_seconds": { + "mv": 1.219, + "cnservice": 9.961 + }, + "vet": "pass", + "incremental_lint_issues": 0, + "full_cn_race_environment_note": "Initial run inherited author-added GOMEMLIMIT=3GiB and failed the unrelated default-memory-limit assertion (actual 3221225472 vs expected MaxInt64). Same code passes the complete package with the normal unset memory limit; no test/source assertion was changed. Raw failed and successful logs retained." + }, + "new_head_ci": "pending publication", + "evidence_generation": "pre-merge protocol 117 capture; superseded for current-head native proof by protocol-118 results" +} diff --git a/docs/design/materialized_view_validation.md b/docs/design/materialized_view_validation.md new file mode 100644 index 0000000000000..0b1bc5db5d4ec --- /dev/null +++ b/docs/design/materialized_view_validation.md @@ -0,0 +1,310 @@ +# Materialized View Validation and Performance Plan + +- Status: experimental P1; SQL, publication, lifecycle and native upgrade/crash checks have separate evidence; broader workloads remain pending +- Design: [Materialized Views RFC, revision 3](../rfcs/00000000_materialized_views.md) +- Historical performance prototype: `dd38098853ea197699ed3fac3e69dc53975ac061` +- User requirement: implement the feature, independently design cases from + StarRocks documentation, then verify usability and actual performance benefit + +## Native upgrade and crash boundaries (C07/C10/C12) + +The [native recovery procedure](materialized_view_native_recovery.md) defines +the isolated old/new binary topology, deterministic commit barriers and +independent SQL oracles. Its [result ledger](materialized_view_native_recovery_results.json) +retains binary/source identity, SQL state changes and process exit codes. +This evidence supplements the older graceful restart and in-memory failure +tests; those tests alone do not establish durable task replay or compatibility. +General CI's skipped compatibility jobs are not relabeled as successful. + +## Reference behavior and scope + +Use the official [async MV overview](https://docs.starrocks.io/docs/using_starrocks/async_mv/Materialized_view/) +for grouped/join reports and manual/scheduled refresh scenarios; +[REFRESH syntax](https://docs.starrocks.io/docs/sql-reference/sql-statements/materialized_view/REFRESH_MATERIALIZED_VIEW/) +for completion and refresh task observability; and +[query rewrite use cases](https://docs.starrocks.io/docs/using_starrocks/async_mv/use_cases/query_rewrite_with_materialized_views/) +for matching, rollup, predicates and EXPLAIN verification. These documentation +pages currently display Latest-4.1; the implementation reference is separately +pinned to code tag 3.5.7. Record both, not pretend they are the same revision. + +These are behavior references. MO uses its proposed syntax, native transaction +semantics, and conservative permissions. Distribution clauses, external catalogs, +partition refresh, nested MVs and transparent rewrite not implemented in P1 are +reported as NOT IMPLEMENTED. Rejection tests can pass without claiming support. + +## Minimal SQL fixture and independent oracle + +Use one test-owned database per case or suite fixture with deterministic cleanup. +No million-row fixture is needed to prove ordinary correctness. + +```sql +CREATE TABLE orders ( + id INT PRIMARY KEY, + day DATE, + region VARCHAR(8), + amount DECIMAL(12,2) +); +INSERT INTO orders VALUES + (1,'2026-10-01','east',10.00), + (2,'2026-10-01','east',20.00), + (3,'2026-10-01','west',NULL), + (4,'2026-10-02','east',30.00), + (5,'2026-10-02',NULL,5.00), + (6,'2026-10-02','east',NULL); + +-- Proposed MO syntax; requires implementation. +CREATE MATERIALIZED VIEW daily REFRESH MANUAL AS +SELECT day, region, SUM(amount) AS total, + COUNT(*) AS n, COUNT(amount) AS nonnull_n, + MIN(amount) AS lo, MAX(amount) AS hi, AVG(amount) AS mean_amount +FROM orders GROUP BY day, region; +REFRESH MATERIALIZED VIEW daily; +SELECT * FROM daily ORDER BY day, region; +``` + +Expected groups, compared without relying on result order: + +| day | region | total | n | nonnull_n | lo | hi | mean_amount | +|---|---|---|---|---|---|---|---| +| 2026-10-01 | east | 30 | 2 | 2 | 10 | 20 | 15 | +| 2026-10-01 | west | NULL | 1 | 0 | NULL | NULL | NULL | +| 2026-10-02 | east | 30 | 2 | 1 | 30 | 30 | 30 | +| 2026-10-02 | NULL | 5 | 1 | 1 | 5 | 5 | 5 | + +Two independent oracles are required: typed expected values for this fixture, +and the original source SELECT at the captured source snapshot S. Compare +multisets, SQL NULLs, DECIMAL scale/precision and result column metadata. A hash +alone is not the sole correctness oracle. Never compare an old MV result with +current source rows after a concurrent write and call the mismatch a bug. + +Mutation sequence: INSERT east=7; UPDATE id=1 from 10 to 50; DELETE id=2; +REFRESH again. Verify totals with a separately computed expected result. Read +before refresh still returns last-good materialization. Keep GROUP BY and scalar +aggregate empty-input cases separate: grouped output has zero rows, scalar +COUNT(*) has one row containing 0, scalar SUM has one row containing NULL. + +## Functional case inventory + +| ID | Case | Required observable assertion | Stage | +|---|---|---|---| +| F01 | Create and inspect | SHOW CREATE/columns preserve definition, types and aliases; unpopulated read errors | P1 | +| F02 | First full refresh | Fixture equals typed oracle and source SELECT at S | P1 | +| F03 | Repeated refresh with no writes | No duplicate output; row counts and coverage are valid | P1 | +| F04 | INSERT/UPDATE/DELETE then refresh | Last-good before refresh; complete new result afterward | P1 | +| F05 | Empty and all-NULL input | COUNT, SUM, AVG and grouping retain SQL semantics | P1 | +| F06 | Join and aggregate | Dimension/fact duplicate matches retain multiplicity; changed dimension reflected after full refresh | P1 | +| F07 | Captured SQL context | Different session timezone/SQL mode cannot silently change persisted definition semantics | P1 | +| F08 | Output naming | Expanded star, aliases and headings fixed; duplicate output names rejected | P1 | +| F09 | Read-only object | DML, LOAD DATA, generic ALTER/TRUNCATE/DROP TABLE and unauthorized internal writes rejected | P1 | +| F10 | Source identity lifecycle | ALTER/RENAME/DROP/TRUNCATE/COPY blocked with dependencies; name reuse never rebinds silently | P1 | +| F11 | Permissions and tenant | Same object names in two accounts isolated; live owner/role revocation suspends refresh | P1 | +| F12 | Manual/scheduled policy | Fake clock proves coalescing, no overlapping queue growth, observable run status | P1 | +| F13 | Drop cleanup | DROP MV cleans owned state; ordinary DROP DB rejects surviving MVs; DROP ACCOUNT transactionally retires populated/periodic MVs and cleans metadata/grants/objects | P1 | +| F14 | Unsupported shapes | Volatile functions, UDF, LIMIT, external/history sources and MV nesting rejected clearly | P1 | +| F15 | Prepared/direct queries | Prepared SELECT still respects object kind, snapshot and privilege changes | P1 | +| G01 | Native timestamp provenance | Source S differs from publication C and is reported accurately | P1 | +| G02 | Branch source | Branch and main results differ correctly; branch operation obeys identity fences | P1 if branch owner admitted | +| G03 | Historical refresh | Pinned snapshot used for all sources; snapshot name recreated with new identity rejected | P1.1 | +| G04 | Snapshot retention | DROP/PITR shrink/reclaim race cannot remove active historical input | P1.1 | +| G05 | Historical output | Prior output snapshot reads corresponding result and historical metadata | later extension | +| R01 | Exact match rewrite | Original SQL reads MV; output equals base query; EXPLAIN proves selection | P2 | +| R02 | Group-key rollup | Coarser grouping merges SUM/COUNT correctly and finalizes AVG from SUM/COUNT | P2 | +| R03 | Predicate/HAVING negatives | Changed filter, missing grouping column, wrong collation or DISTINCT cannot unsafe-match | P2 | +| R04 | Freshness default | DML after S without schema change forces base fallback unless complete no-change proof exists | P2 | +| R05 | Explicit stale permission | Age checked from source S; boundaries use fake time; EXPLAIN exposes permission | P2 | +| R06 | Prepared rewrite reexecution | Changed data/privileges/epoch never reuse an obsolete freshness authorization | P2 | + +## Concurrency, failure and recovery cases + +Use injected hooks and barriers in the refresh executor. Map a concrete producer +and consumer to each hook; no arbitrary sleep-based polling. + +| ID | Injected boundary | Assertion | +|---|---|---| +| C01 | Pause after DELETE, before INSERT | Reader at another snapshot still sees complete old rows | +| C02 | Pause after INSERT, before publication commit | Readers never see a mixed/partial result | +| C03 | Source commits between refresh statements | Every source read still uses one SI snapshot S | +| C04 | Two CNs publish same MV | At most one conflicting publication commits; stale sequence cannot regress state | +| C05 | Replay same task/run | No double publication or contradictory terminal status | +| C06 | Failure in scan/write/metadata publication | Entire replacement aborts; last-good rows and coverage remain | +| C07 | Lost response after commit | Restart checks durable run/txn outcome; no accidental FAILED overwrite | +| C08 | Timeout/cancel/shutdown during wait or execution | Transaction, Result, admission and spill resources terminate/release | +| C09 | DROP MV/DB/account racing task | DROP DB RESTRICT preserves live MVs; MV/account retirement fences publication into dropped/recreated identity and makes queued tasks obsolete | +| C10 | Crash after policy commit before task creation | Reconciliation restores intended schedule once | +| C11 | Backup/PITR restore | Objects restored paused; owner/bindings checked; tasks not resurrected | +| C12 | Mixed-version or downgrade | Incapable CN cannot claim task/execute MV; unsafe downgrade refused | + +Run focused race evidence only for the changed concurrency closures. UT owns +failure injection/clock/algorithm proofs; BVT owns public SQL/results/errors; +multi-CN/restart suites own distribution and persistence, not duplicate all UTs. + +## Performance experiment + +Verify correctness before timing. Use the same binary, account, resource limits, +typed parameters and committed source version for raw and MV queries. Baseline +mode must explicitly disable any later automatic MV rewrite. Record plans. + +Deterministically generate 1 million fact rows and 10 thousand dimension rows; +scale to 10 million only if environment/admission permits. Use integer cents +and DECIMAL for exact comparison, 365 days, 20 regions, 1000 products, and skewed +as well as uniform keys. Persist generator version/seed, row counts and hashes. +Correctness fixtures remain separate from this benchmark dataset. + +| ID | Raw query / materialization | Question answered | +|---|---|---| +| B01 | Daily-region SUM/COUNT over facts | Benefit of high reduction ratio | +| B02 | Monthly report from daily summary | Explicit rollup benefit; automatic rollup measured separately in P2 | +| B03 | Fact-dimension join grouped by segment | Savings from precomputing repeated joins | +| B04 | Narrow filter on raw indexed key | Control showing an MV need not win every query | +| B05 | High-cardinality summary near fact size | Storage/refresh cost and weak-benefit boundary | +| B06 | 4-client mixed reports | Throughput, latency and contention | +| B07 | Query while full refresh runs | Reader stability and resource competition | +| B08 | Source-write workload with P1 enabled | Refresh/background overhead on business writes | + +For single-query warm timings: two warmups, then 50 paired observations; alternate +or seeded-randomize raw/MV order. Retain all samples, median, P95, dispersion and +any errors. P95 from 50 samples is descriptive, not a reliable production-tail +estimate. Separate client connection time from query execution. Retrieve the +entire result, not only time Execute(). Compare outputs each observation. + +Cold-cache claims require an actual controlled cache-reset protocol. A first +run or reconnect is insufficient. If cache cannot be controlled, report warm +results only. For concurrent runs use fixed offered work or equal duration and +separate connection setup; record completions, errors, QPS and latency. Respect +the environment budget and avoid running unrelated databases simultaneously. + +Measure refresh duration, rows scanned/written, CPU time, peak admitted memory, +spill/temporary disk, physical result size, retained MVCC/compaction cost, and +source-write median/P95. Report initial and repeated full refresh separately. +Use actual engine profile/metrics where available; do not invent absent counters. + +Required reported calculations: + +```text +query_speedup = median(raw_query_ms) / median(mv_query_ms) +break_even_queries = ceil(refresh_ms / (raw_query_ms - mv_query_ms)) +``` + +Break-even is defined only when the denominator is positive. Include CREATE and +repeated-refresh costs for the chosen refresh window; latency-only break-even is +not a complete CPU/storage economic model. For a window with N queries compare +`N * raw_cost` with `refresh_cost + N * mv_cost`. Report dimension cardinality, +freshness interval and reduction ratio alongside speedup. Do not choose only the +fastest query or best repeat. If no measurable benefit exists, report that result. + +Correctness has zero tolerance for wrong rows/partial visibility/privilege leaks. +Query improvement targets are workload-specific hypotheses, not claims before +measurement. A positive grouped-report outcome requires the observed median gain +to exceed repeat dispersion and its refresh cost to amortize within the stated +query frequency. Controls and low-benefit cases remain in the report. + +## Delivery evidence and stage labels + +After implementation, deliver checked-in SQL cases/expected outputs, focused UTs, +the reproducible generator/benchmark runner, raw measurements, EXPLAIN/profile +evidence, binary/source SHA, configuration and a concise measured report. +Every case records PASS/FAIL/NOT IMPLEMENTED/BLOCKED, stage and exact command. +Pending, skipped, blocked or parser-only evidence is never an MV runtime pass. +P1 explicit-MV acceleration is never labeled transparent-query-rewrite benefit. + +Follow the repository native/CGo validation wrapper for owning packages. Reuse +valid existing evidence, but new code and altered semantic inputs invalidate the +relevant result. Any environment/download/port permission blocker is reported +separately from product correctness. This plan itself is documentation-only and +has not produced benchmark results. + + +## Local execution record — 2026-10-12 + +Task baseline is `dd38098853ea197699ed3fac3e69dc53975ac061`; task changes are local +tracked/untracked changes relative to that HEAD. The unrelated committed range +against origin/main is excluded from this task delivery. Remote base freshness +was not re-established. Toolchain: installed Go 1.27.1, Linux amd64, CPU CGo, +repository native artifacts reused by the controlled test wrapper. + +| Evidence | Result | Scope/limit | +|---|---|---| +| Focused materialized-view tests | PASS: 19 top-level tests and 64 subcases | Parser/binder/catalog/frontend/compile/service/writer boundaries; final plan/parser log supersedes earlier failing attempts | +| Owning package suites | PASS | catalog, mv, bootstrap v4_0_15, mysql parser, insert, multi_update | +| Race, 100 repeats per exact test | PASS | output counter, failure boundaries, admission, timezone, reconciliation identity; package JSON terminal pass events retained | +| Go build | PASS | service binary and standalone SQL harness | +| Incremental go vet | PASS | changed package closure plus direct consumers; final plan/harness check repeats after last edits | +| Formatting and diff whitespace | PASS | task's changed/new Go files and git diff --check | +| Full configured lint | NOT RUN | golangci-lint unavailable; goimports tool build hit a missing cached module and denied network | +| Local service/public SQL | BLOCKED | TCP bind: socket operation not permitted; permission request interrupted | +| Scheduled SQL, native restart, multi-CN and downgrade | NOT EXECUTED | no running local cluster | +| Performance B01 | HARNESS READY, NOT EXECUTED | deterministic million-row/128-group explicit MV; 50 alternating samples, plans, equality and refresh cost | +| Performance B02–B08 | PLANNED | broader benchmark inventory above remains required; no fabricated speedup | + +Evidence logs are under `/workspace/mv-build/`: `final-focused.log`, +`plan-parser-final.log`, `owning-tests.log`, `race-*.json`, `vet.log`, +`vet-final.log`, and the failed `server.log`. The current service and SQL harness +are in that same test-owned directory. Read `test/materialized_view/README.md` +for the runnable SQL, security, tenant, concurrency and restart companion. + +The unit failures found and fixed single-table JOIN representation, missing +sampling/parameter rejection, source-kind admission after view expansion, +duplicate output names, and fixed-offset timezone reconstruction. A qualified +function rejected by the parser is tested at that parser boundary rather than +counted as an AST-validation case. Actual SQL fixtures and performance remain +unverified; this is not a release PASS. + + +## Runtime evidence update — 2026-10-13 + +Network permission was granted after the earlier interrupted request. The local +service then exposed and helped fix the nested-statement, global catalog tenant +initialization, task ID width and missing deadline issues. Final runs passed +66 main SQL checks, 3 restart checks and 5 native failure/cleanup checks. +Four performance scenarios completed with 50 alternating pairs each. The earlier +BLOCKED rows above describe the initial attempt and are superseded by +[the execution report](materialized_view_results.md). Nine additional two-CN +publication/identity/history checks passed (83 total SQL checks). Delivery-focused +tests passed 22 top-level tests and 65 subcases; the six owning package suites +passed again after the runtime fixes. Task identity, reconciliation identity and +refresh failure boundaries each passed a separate exact-name 100-repeat race +run. No mixed-version upgrade/downgrade or B04/B06–B08 execution is claimed. + +## Publication update — 2026-10-13 + +The branch rebased onto fresh main `3e50e1b32d8da61bbbf70c89989fb08b671809de` +uses protocol 112. Revalidation passed 22 focused tests / 66 subcases and six +owning suites. Protocol 111 and authoring floor 111 reject MV authoring. +Configured incremental golangci-lint 2.14.0 passed with zero findings after +strengthening complete result consumption, stream-error checks and row cleanup +in the SQL harness. A new native escaped-source-name / NO_BACKSLASH_ESCAPES case +found and verified a control-plane parser-mode isolation fix. The final native +case count is 84: 67 main + 3 restart + 5 failure/cleanup + 9 two-CN. +The publication evidence is separate from original baseline measurements in +[the execution report](materialized_view_results.md). + +### Revision 3 account and migration regression acceptance + +- Existing initialized catalog with all four MV tables absent and automatic + migration disabled: ordinary ALTER, DROP/TRUNCATE, CREATE/DROP INDEX and DROP + DATABASE remain usable in pessimistic and optimistic modes, with the feature + disabled. Restore the task-owned schema before any MV feature cases. Installed + dependent sources continue to reject DDL; partial catalog installation and + catalog-read errors fail closed rather than silently disabling guards. +- One periodic MV with last-good rows: change its source, suspend/restrict the + account, dispatch a typed scheduled envelope and await a terminal failure. + Verify successful_sequence, source snapshot and native rows did not change. + Reopen and dispatch a fresh envelope; verify successful refresh equals source. + Missing account/unknown status and downstream status-query errors reject. +- Administrative DROP ACCOUNT with surviving populated and periodic MVs succeeds; + verify all four MV catalog rows, native relations, tenant grants and queued + account envelopes are removed. A captured old envelope cannot publish after + retirement. Ordinary DROP DATABASE still rejects the same surviving MVs. +- Inject failure at retirement and after retirement in the account transaction: + require rollback (no tenant DROP DATABASE after early failure); account, MV + policy, dependency closure and last-good rows remain intact for retry. + +This is the selected P1 policy, not a claim of external design approval. + +Evidence boundaries for the old-catalog controls: a fresh normal login on the +4.0.14 fixture first hits existing tenant-version admission. The isolated kernel +before/after comparison uses supported skipCheckUser sessions only there, with +privilege checks retained, and proves six DDL guards in each transaction mode. +Normal account/ACL cases use authenticated sessions. This does not satisfy the +separate normal-login/mixed-version release gate. Case-level/source hashes and +functional fixture cost are in materialized_view_review_lifecycle_results.json. diff --git a/docs/rfcs/00000000_materialized_views.md b/docs/rfcs/00000000_materialized_views.md new file mode 100644 index 0000000000000..fad1de64d7962 --- /dev/null +++ b/docs/rfcs/00000000_materialized_views.md @@ -0,0 +1,916 @@ +- Status: experimental P1 implemented and locally validated; release gates pending +- Start Date: 2026-10-12 +- Authors: Codex, at the user's request +- Design revision: 3 (account lifecycle and pre-migration admission clarified) +- User approval: 2026-10-12, "去实现吧"; P1 implementation and validation authorized. +- Implementation PR: [#30085](https://github.com/matrixorigin/matrixone/pull/30085) (experimental P1) +- Issue for this RFC: [#30079](https://github.com/matrixorigin/matrixone/issues/30079) +- Code baseline: `dd38098853ea197699ed3fac3e69dc53975ac061` +- Publication baseline: `3e50e1b32d8da61bbbf70c89989fb08b671809de` (fresh main) +- Reference implementation: StarRocks tag `3.5.7`; file blob hashes recorded in + [the source manifest](../design/materialized_view_reference_manifest.json) + +# Materialized Views for MatrixOne + +# Summary + +Introduce a read-only, stored-query relation with explicit refresh semantics. +The first release supports native tables, manual refresh, bounded periodic +refresh, and direct SELECT. Each refresh replaces the complete stored result +and its coverage metadata in one MatrixOne transaction. Readers see the last +committed result, never a partially refreshed result. + +Use StarRocks' separation of catalog object, refresh execution, coverage +tracking, and optimizer candidate preparation. Implement these contracts with +MatrixOne's existing SQL planner, transaction-scoped SQL executor, task service, +and native storage. Do not port StarRocks FE edit-log or partition-version +protocols into MO. + +The MV capability requires protocol 118 at catalog migration, task publication, +DDL authoring and relation execution. Protocol 117 belongs to upstream's +collation-aware LEAST/GREATEST semantics and is insufficient for MV support. +The protocol allocation follows main; catalog 4.0.15 and task executor 17 retain +their existing identities. + +Transparent rewrite is a separate release. By default a base-table query must +retain its current transactional semantics. An asynchronous MV is not safe for +rewrite merely because its most recent refresh succeeded. Incremental refresh +and synchronous maintenance are also separate from the initial implementation. + +The design below includes later-stage proposals; external review of revision 3 remains pending. The P1 prototype now +implements the subset documented in the implementation notes and execution +report; its feature gate is disabled by default. P2/P3 remain proposals. + +# Motivation and Current-Code Evidence + +Repeated grouped reports and native-table joins redo the same work. Users can +manually maintain summary tables, but there is no native persistent MV contract +connecting definition, refresh atomicity, authorization, recovery, and rewrite. +No runtime performance claim is made by this RFC. + +The inspected checkout has the following relevant boundaries: + +| Existing code | Observed responsibility | Design consequence | +|---|---|---| +| `pkg/sql/parsers/dialect/mysql/mysql_sql.y::create_view_stmt`, `pkg/sql/parsers/tree/view.go` | Logical-view grammar and AST | Add distinct MV ASTs; do not reinterpret CREATE VIEW. | +| `pkg/sql/plan/build_ddl.go::inferViewColumns`, `genViewTableDef`, `buildCreateView` | Bound output columns, expanded stars, persisted SQL context | Reuse semantic binding and output inference, not logical-view storage metadata. | +| `pkg/sql/plan/view_dependency.go::ViewDependency` | Account, database, physical/logical relation identities, version, binding names, snapshots | Reuse identity vocabulary; names alone are insufficient. | +| `pkg/sql/compile/ddl.go::Scope.CreateView` | DDL locking, relation creation, dependency hooks | Add dedicated MV DDL dispatch and transaction ownership. | +| `pkg/sql/compile/view_metadata.go::ViewMetadataRefreshEnabled` | Returns false; ordinary-view recovery layer is inactive | MV correctness cannot depend on activating this separate feature. | +| `pkg/catalog/view_metadata.go` | Existing ordinary-view metadata cluster-table definitions | Add separate MV catalogs with account-qualified keys. | +| `pkg/util/executor/types.go::SQLExecutor.ExecTxn`, `TxnExecutor` | Multiple internal SQL statements in one transaction | Own full-refresh atomicity here. Close every executor Result. | +| `pkg/util/executor/options.go::WithTxnIsolation`, `WithTxnMode` | Explicit isolation/mode for internal transactions | Refresh must explicitly select SI; do not inherit RC defaults. | +| `pkg/taskservice/sql_task_executor.go::executeStatements` | Iterates statements using frontend InternalExecutor calls | Reuse task infrastructure, not a DELETE/INSERT SQLTask body assumed atomic. | +| `pkg/cnservice/server_task.go` | Registers task executors, including SQLTask and ISCP | Register one MV refresh executor with explicit capability admission. | +| `pkg/sql/plan/query_builder.go` | Main logical-query transformations, joins and index selection | Future rewrite must enter before irreversible physical/index choices. | +| `pkg/sql/plan/optimize.go::defaultRules`, `BaseOptimizer` | Current rule list is small; not a StarRocks-style memo optimizer | Do not claim adding one rule here imports SPJG rewrite. | +| `pkg/vm/engine/types.go::Relation.CollectChanges`, `pkg/iscp/types.go::DataRetriever.GetToTS` | Change collection and coverage timestamp vocabulary | Potential future incremental substrate; not an existing strict-freshness oracle. | +| `pkg/frontend/snapshot.go::doResolveSnapshotWithSnapshotName`, `planSnapshotFromRecord` | Named snapshot TS, tenant and scope resolution | Reuse this owner for a historical-refresh extension. | +| `pkg/frontend/databranchutils/lineage_publication_lock.go`, `branch_protect_snapshot.go` | Shared snapshot/lineage barriers, retention and reclaim | Recording a source TS alone does not reserve history. | +| `pkg/frontend/data_branch_hashdiff.go::hashDiff`, `hashDiffIfHasLCA`, `hashDiffIfNoLCA` | Lineage-aware and fallback branch comparisons | Offline validation/delta investigation, not a cheap query-time version counter. | +| `pkg/bootstrap/versions/` | Versioned catalog upgrades with protocol requirements | Add migrations in the next allocated version, not an old release directory. | + +Baseline branch was `work`; the worktree was clean at task start. Local +`origin/main` and merge-base were +`23d8f61252f3017dff218b530817a240206fd762`. That remote ref was not fetched, so +it is not a freshness claim. The existing branch contains substantial unrelated +committed work. This RFC only reviews the task's new documentation delta. + +# Goals, Stages, and Invariants + +## Release boundaries + +| Stage | Deliverable | Required gate | +|---|---|---| +| P1 | Native-table MVs; manual/periodic full refresh; direct SELECT; lifecycle and recovery | Atomic replacement, tenant/privilege checks, complete catalog/DDL consumer audit | +| P2 | Bounded single-table aggregate rewrite | Default strict semantics; complete coverage proof or explicit stale-read opt-in | +| P3 | Partition refresh and single-table incremental aggregates | Partition identity, deletes/updates, retained-history and checkpoint proof | +| P4 | Multi-table rewrite, external catalogs, MV nesting, broader incremental maintenance | Separate reviewed extensions and data-source-specific proofs | + +P1 supports projection/filter queries, inner equijoins, and GROUP BY with +SUM/COUNT/MIN/MAX/AVG over native, persistent tables in the MV's own database +and account. It supports a scalar aggregate without GROUP BY, including the +one-row result for empty input. Full refresh uses the normal query semantics; +it does not need mergeable aggregate states. Require explicit, unique output +names; expand SELECT * at creation so future additions cannot change the output. + +Reject external/system/temporary/cluster/subscription/historical relations, +logical views, other MVs, recursive CTEs, correlated subqueries, set operations, +windows, DISTINCT aggregates, LIMIT/OFFSET, locking reads, SELECT INTO, side +effects, user variables, and volatile or context-sensitive expressions in P1. +Allow deterministic built-in functions with a persisted semantic context. +Unknown determinism is a rejection, not an optimistic assumption. Reject UDFs +initially, including deterministic declarations that have no verified version +and dependency contract. + +Creation is deferred: the relation exists but is unpopulated until first refresh. +Initial population is an explicit operation. This keeps large refresh failures +separate from DDL success and avoids a hidden long-running CREATE transaction. + +## Required invariants + +1. **Atomic publication:** stored rows, `populated`, successful refresh ID, + source snapshot TS, and definition epoch become visible in one commit. +2. **Single source snapshot:** all base tables in a refresh are read at one + transaction snapshot S, using the definition's captured semantic context. +3. **No freshness inflation:** S is the actual source snapshot, not refresh end + time, task heartbeat time, or the publishing transaction's later wall clock. +4. **Last-good retention:** a failed, cancelled, timed-out, or aborted refresh + cannot delete or replace the previously committed result. +5. **Identity safety:** account/database/logical relation identity, physical + binding, schema version, and definition epoch are validated, not just names. +6. **Serialization:** at most one refresh transaction can publish a given MV; + duplicate delivery cannot apply the same logical run twice. +7. **Read-only public relation:** users cannot INSERT/UPDATE/DELETE/TRUNCATE, + rename, mutate indexes, or ALTER its stored result through table syntax. +8. **Strict default:** an unproven or stale MV never silently changes a normal + base-table query's transactional result. +9. **Security:** every metadata key and task carries account identity; system + catalog access is separate from source/target data access. +10. **Bounded work:** refresh, waiting, retry, history, and optimizer candidate + enumeration have admission bounds and cancellation owners. + +# StarRocks Implementation Reference + +The reference is deliberately pinned to tag 3.5.7 rather than an evolving main +branch. Blob hashes identify the inspected contents; no Java source is copied +into production. The manifest records all eight inspected files. + +| StarRocks source and inspected symbols | Adopt in MO | Do not copy into P1 | +|---|---|---| +| [MaterializedView.java](https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/catalog/MaterializedView.java), `MaterializedView extends OlapTable`, `AsyncRefreshContext`, `MvRefreshScheme` | A stored relation plus definition, activity and coverage metadata | Java object serialization and FE global catalog ownership | +| [MaterializedViewAnalyzer.java](https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/sql/analyzer/MaterializedViewAnalyzer.java) | Bind and validate definition before creating metadata | Assume all StarRocks syntax/table restrictions match MO | +| [TaskBuilder.java](https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/scheduler/TaskBuilder.java) | Derive refresh tasks from durable MV metadata | A second independent scheduler or SQL body as authority | +| [PartitionBasedMvRefreshProcessor.java](https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/scheduler/PartitionBasedMvRefreshProcessor.java), `doRefreshMaterializedView` | Capture dependencies, build a refresh query, execute, then acknowledge coverage | Its partition synchronization, retries, and separate metadata update ordering | +| [MVVersionManager.java](https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/scheduler/mv/MVVersionManager.java), `updateMVVersionInfo` | Track coverage separately from job status; a changed join dimension affects all relevant output | Treat MO schema versions as StarRocks partition data versions | +| [MvRewritePreprocessor.java](https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/MvRewritePreprocessor.java), `prepare` | Indexed dependency lookup, bounded candidates, plan and freshness checks | Unbounded catalog scans or an unnecessary parallel plan-preparation pool | +| [MaterializedViewRewriter.java](https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rule/transformation/materialization/MaterializedViewRewriter.java) | Bound expression matching and residual-predicate proof | Immediate outer-join, view-delta, query-delta, or union compensation support | +| [AggregatedMaterializedViewRewriter.java](https://github.com/StarRocks/starrocks/blob/3.5.7/fe/fe-core/src/main/java/com/starrocks/sql/optimizer/rule/transformation/materialization/AggregatedMaterializedViewRewriter.java) | Separate aggregate rollup, projection mapping and HAVING handling | Blindly sum finalized AVG or DISTINCT results | + +StarRocks is architectural precedent, not a mandatory compatibility standard. +MO's own MVCC, typed SQL results, tenant model, and failure semantics are the +controlling contracts. A physical columnar relation remains sufficient; an +Aggregate table model is not a prerequisite for this MV feature. + +# Proposed SQL Contract + +```sql +CREATE MATERIALIZED VIEW sales_daily +REFRESH MANUAL +AS SELECT order_day, region, + SUM(amount) AS total_amount, + COUNT(*) AS order_count + FROM orders + GROUP BY order_day, region; + +-- Foreground operation; returns only after refresh commits or fails. +REFRESH MATERIALIZED VIEW sales_daily; + +-- Separate example: periodic, full, asynchronous refresh. +CREATE MATERIALIZED VIEW sales_daily_scheduled +REFRESH EVERY INTERVAL 5 MINUTE +AS SELECT order_day, region, SUM(amount) AS total_amount + FROM orders GROUP BY order_day, region; + +SELECT * FROM sales_daily; +SHOW MATERIALIZED VIEWS; +SHOW CREATE MATERIALIZED VIEW sales_daily; +SHOW MATERIALIZED VIEW REFRESHES sales_daily; +ALTER MATERIALIZED VIEW sales_daily REFRESH MANUAL; +ALTER MATERIALIZED VIEW sales_daily REFRESH EVERY INTERVAL 10 MINUTE; +DROP MATERIALIZED VIEW IF EXISTS sales_daily; +``` + +P1 intervals are positive integral SECOND/MINUTE/HOUR/DAY values normalized to +seconds, minimum 60 seconds. Missed intervals are coalesced into one run, not +replayed individually. The interval is measured from scheduled due times; +overlapping runs are skipped/coalesced, never accumulated unboundedly. + +An unpopulated MV returns `MV_NOT_POPULATED`, not an empty result that could be +mistaken for a completed empty refresh. A populated MV returns its stored, +possibly old result. SHOW exposes source snapshot TS, last successful finish +time, last attempt status, definition epoch, last error, and next due time. +Do not label it CURRENT merely because a refresh finished. + +Reject CREATE OR REPLACE and definition-changing ALTER in P1. IF NOT EXISTS +does not replace existing definitions, schedules, or grants. Unsupported +object-kind operations produce an MV-specific error. Existing logical VIEW +syntax, expansion and grants keep their own semantics. + +CREATE/ALTER/DROP/REFRESH are rejected inside an active user transaction in +P1. Direct SELECT is allowed within user transactions and uses their normal +snapshot visibility. A future rewrite is prohibited in transactions with +local writes or historical bindings until explicitly proven safe. + +# Catalog and Relation Model + +## Ownership + +Store the MV itself as one native relation with a new reserved relkind, proposed +`SystemMaterializedViewRel = "m"`. Audit availability before allocating it. +Its columns and physical storage are ordinary native columns/storage; it is +not `SystemViewRel` and must not carry `ViewSql` that triggers logical-view +expansion. Its stable table ID survives every refresh. + +Propose an additive `MaterializedViewDef` marker in `proto/plan.proto::TableDef` +containing catalog format and definition epoch. Allocate the next unused field +only during implementation. The authoritative query definition is the MV +catalog row, not a duplicated serialized logical plan. Stored bound signatures +are derived and versioned; they may be discarded and rebuilt. + +Use four new system-owned cluster tables, following the account-qualified +catalog pattern. Only trusted code writes them. All access filters account ID. + +| Table | Primary / secondary keys | Authoritative fields | +|---|---|---| +| `mo_catalog.mo_materialized_views` | PK `(account_id, mv_id)`; unique `(account_id, database_id, name)` | logical/physical identity, definition epoch, expanded canonical SELECT, default DB, SQL mode, timezone, identifier/collation semantics, output schema signature, owner user/role IDs, desired refresh policy/version, requested/successful sequence, populated, successful run ID, typed source-version descriptor with full source snapshot TS, last-success timestamp | +| `mo_catalog.mo_mv_dependencies` | PK `(account_id,mv_id,source_logical_id)`; reverse index `(account_id,source_database_id,source_logical_id,mv_id)` | source physical ID, logical ID, binding names, schema version, referenced column sequence numbers/types; checked definition epoch | +| `mo_catalog.mo_mv_refresh_runs` | PK `(account_id,mv_id,run_id)`; history index `(account_id,mv_id,started_at)` | queued/running/succeeded/failed/cancelled attempt status, expected definition epoch, attempt count, publisher transaction ID, source TS, bounded error code/message and timestamps | +| `mo_catalog.mo_mv_account_state` | PK `(account_id)` | dependency-admission guard and transactional MV-count quota; created during tenant admission and removed by account lifecycle | + +Lifecycle metadata distinguishes `populated` from definition activity and run +status. A running or failed attempt does not hide last-good data. Derived +invalidity comes from current binding checks; a cached ACTIVE flag alone cannot +authorize a scan, refresh, or rewrite. + +Each source is native and in the same account/database in P1. Namespace and +owner identity are resolved before metadata lookup. A clone/restore creates new +physical and catalog identities rather than inheriting a live worker's run ID. + +# Refresh Execution and Atomicity + +## Existing execution primitives and a necessary change + +Implement a dedicated refresh service in a proposed `pkg/mv` owning package. +It depends on executor/engine/task abstractions; it must not import frontend or +sql/compile and create an import cycle. Inject live privilege and catalog +binding checks from their owners. Manual and scheduled refresh share this +service, rather than maintaining separate SQL paths. + +Use `SQLExecutor.ExecTxn` with explicitly selected optimistic SI for the full +replacement transaction. Optimistic write-conflict detection arbitrates +concurrent publishers through one MV catalog row. A durable run ID and expected +definition epoch fence stale retries. Runtime admission reduces duplicates but +is never the correctness mechanism. + +The data replacement is `DELETE` plus `INSERT ... SELECT` in one transaction, +with publication metadata written in that transaction. Do not use TRUNCATE, +DROP/CREATE, RENAME swaps, INSERT OVERWRITE assumptions, or independent SQLTask +statements. Those alternatives have different identity/DDL/transaction rules. + +## Proposed execution sketch + +```go +// Design pseudocode. These MV-specific APIs do not exist yet. +func Refresh(ctx context.Context, key MVKey, runID RunID, sequence, epoch uint64) error { + admission := acquireBoundedRefreshSlot(ctx, key.AccountID) + defer admission.Release() + checkLiveOwnerAndSourcePrivileges(ctx, key) + ensureAttemptRecorded(ctx, key, runID, sequence, epoch) + + return sqlExec.ExecTxn(ctx, func(tx executor.TxnExecutor) error { + definition := loadMVAtTxnSnapshot(tx, key) + if definition.LastSuccessfulRun == runID { return nil } + requireDefinitionEpoch(definition, epoch) + requireNonObsoleteSequence(definition, sequence) + validateStableBindingsAndOutputSchema(tx, definition) + // This authoritative row is written by refresh and MV lifecycle DDL. + // Conflicts cause the entire publication to abort, never partial data. + guardPublicationRow(tx, key, epoch, sequence, runID) + + sourceTS := tx.Txn().SnapshotTS() + capability := mintInternalWriteCapability(key, epoch, tx.Txn()) + deleteStoredRows(tx, definition, capability) + insertFromBoundDefinition(tx, definition, capability) + requireUnchangedSnapshot(tx, sourceTS) + publishCoverageAndSuccessfulRun(tx, key, epoch, sequence, runID, sourceTS) + return nil + }, optsWithAccountAndSemanticContext. + WithTxnIsolation(txn.TxnIsolation_SI). + WithTxnMode(txn.TxnMode_Optimistic)) +} +``` + +Every operation above propagates errors; each Result is closed immediately by +the owning helper. Catalog operations use explicit system-tenant statement +options while source/target operations use the MV account. All participate in +the same TxnOperator. No read/write runs with the executor's implicit default +system account. These are proposed APIs, not a compilable implementation. + +`guardPublicationRow` performs a conditional update on the authoritative MV +row, scoped by `(account,mv,epoch)`. Its affected-row result is checked. Under +SI two publishers that started from the same version cannot both commit their +writes to that row. A conflicting attempt retries with a new transaction and +fresh S, at most twice, unless the same run already succeeded. Source row +updates do not require blocking user DML during a refresh: S intentionally +defines the refreshed historical result. + +The creation/dependency and source-DDL races have mode-specific admission. +Optimistic source DDL and MV registration/retirement write the account MV +revision row, then inspect the dependency closure; commit conflicts fence +concurrent membership changes. Pessimistic CREATE pins the complete native +source/target name domain through publication, and source DDL checks dependencies +under existing catalog/name admission. Ordinary pessimistic DDL does not write +an account MV fence. Neither form adds blocking work to ordinary DML or SELECT. +Refresh publishes through its definition row and native schema fences, not this +account-wide dependency guard. + +The account owner first holds its existing lineage lifecycle and account +name/row boundary, then takes the MV revision/definition fences before retiring +native targets in stable mv_id order and entering the tenant database loop. +Each native DROP retains compiler lifecycle/name admission; its retained-lock +FastFail path and normal transaction conflict/cancellation errors abort and roll +back the entire account transaction rather than weakening admission or retrying +individual cleanup statements. Ordinary MV/source DDL retains its existing name +admission order. Account cleanup does not introduce a second transaction, lock +manager, account-wide MV writer capability or a generic DROP DATABASE bypass. + +P1 rejects source ALTER/RENAME/DROP and schema-changing index operations while +dependent MVs exist. No automatic rebinding to a different output schema is +allowed. TRUNCATE/COPY/RESTORE that changes a source's physical identity is also +rejected with dependencies in P1; ordinary INSERT/UPDATE/DELETE remain allowed. +P1 ordinary DROP DATABASE uses RESTRICT: it fails while the database owns MVs, +including unpopulated or periodic MVs, and remains usable after explicit DROP +MATERIALIZED VIEW. Administrative DROP ACCOUNT instead retires all tenant MVs in +the existing account-drop transaction before its tenant DROP DATABASE loop. + +The account lifecycle owner takes its existing account-name/account-row locks, +then the MV account dependency write fence, then writes each definition's epoch +and disables interval/next_due before dropping each native MV using the exact +account/table/transaction-bound writer capability, then deleting dependencies, +refresh history, definitions and account MV state. Enumeration is bounded at the +existing 128-MV account limit. Already queued MV tasks are removed by their +typed account envelope; late deliveries become obsolete because their definition +no longer exists. No generic DROP DATABASE bypass or session flag is introduced. +The ordinary account cleanup removes tenant grants and native databases/objects. +CREATE MV's account fence conflicts with retirement; an admitted refresh's +publication writes the same definition row that retirement updates/deletes, so +both cannot commit across the retired identity. Existing native schema fences +also reject publication into removed objects. All cleanup shares the caller's +transaction: cancellation, task/catalog failure or a later database/metadata +failure rolls back retirement, policy, objects and account deletion together. +Do not open or commit a separate MV transaction from the account owner. + +Before the 4.0.15 migration, MV readiness is checked through the pre-existing +mo_tables system catalog in the DDL transaction snapshot, independently of the +session feature flag or CN registration. Zero MV catalogs means no MV can exist +and ordinary table/database DDL proceeds without querying/writing MV tables. +All four catalogs enable dependency guards; partial installation or metadata +query errors fail closed. This bounded four-name lookup adds one metadata query +per guarded ordinary DDL and no extra user DML/SELECT work. + +InternalExecutor keeps the session account ID synchronized with its context and +final tenant overrides; MV resolution and account checks use that same identity. +Background refresh checks live mo_account status through the system-owned +account catalog before validating tenant user/role and source privileges. Only +one existing OPEN account is admitted; suspension, restriction, missing accounts +and unknown states reject before source execution, preserve last-good rows and +record a sanitized task admission failure. Reopening permits later tasks after +fresh identity/role/source admission. This is admission enforcement, not forced +preemption of a refresh admitted before the status change. + +If a privileged restore/recovery path cannot satisfy these checks, it must +invalidate the MV and pause scheduling, never leave an apparently valid binding +to a different source. Every direct scan revalidates bound source identities; +invalid definitions return `MV_INVALID_DEFINITION`. There is no name-only repair. + +## Visibility and failure boundaries + +Let S be the refresh source snapshot and C the replacement commit. A query +snapshot Q before C reads the previous MV rows and corresponding metadata; +a snapshot after C reads the new rows and corresponding metadata. MO's exact +timestamp comparison convention controls equality at C; tests must use that +convention rather than inventing `<=` visibility. New source commits after S +are not covered even if they occurred before C. + +Run history is operational; `LastSuccessfulRun` and coverage on the MV row are +the success authority. The success history update is part of replacement commit. +After an ambiguous commit response, recover by the same run ID/transaction +outcome before retrying. A delayed worker may update an error only if that run +has not already committed successfully; it cannot overwrite success history. +A client cancellation after commit cannot undo success. + +Before commit: error/cancel/timeout rolls back DELETE, INSERT and publication. +After commit: lost task acknowledgment is safe to replay, because the durable +run ID makes the duplicate a no-op. If a newer run already succeeded, the old +task becomes obsolete and cannot publish an older snapshot. Run requests carry +a monotonic requested sequence; publication rejects sequences below the last +successful sequence as well as mismatched definition epochs. + +# Task Scheduling and Lifecycle + +Reuse `pkg/taskservice` allocation, heartbeat and cron infrastructure. Allocate a +new versioned `TaskCode_MaterializedViewRefresh` and typed context with account, +MV ID, definition epoch, requested sequence and run ID. Do not allocate it by +reusing an existing TaskCode; numeric values must be checked at implementation. +Register an executor in `pkg/cnservice/server_task.go` only on capable CNs. + +MV metadata is schedule authority. CREATE/ALTER writes desired schedule policy +in its DDL transaction; task creation is not a transactional catalog side effect. +A bounded reconciler, submitted through existing task infrastructure, makes +deterministically named cron tasks agree with committed desired policy/version. +Crash between catalog commit and task creation leaves a recoverable intent. +Queued task context contains identity, not a stale SQL body. DROP removes intent +and fences tasks through the missing identity/epoch; reconciler removes orphan +cron entries. Do not run one reconciler goroutine per MV. + +Scheduled and manual requests obtain monotonic requested sequences via the same +catalog API. At most one queued/coalesced request per MV is maintained. +Execution admission is per CN; manual and scheduled requests can still race +across CNs. SI publication conflict and sequence fencing close that race rather +than a claimed cluster-wide local semaphore. +Lost allocation or heartbeat cancels the executor context; +transaction abort/conflict rules remain authoritative even when a worker ignores +the task-service liveness signal temporarily. CN shutdown cancels owned work, +waits within the existing bounded shutdown policy, and leaves durable tasks for +reallocation. Restart rebuilds schedules from catalog and checks transaction +outcomes before changing RUNNING rows to failed/abandoned. + +# Authorization, Read-Only Enforcement, and Consumers + +P1 uses conservative invoker security for explicit SELECT: the caller needs +SELECT on the MV and on referenced sources. This intentionally avoids a new +definer-rights data-sharing capability. CREATE requires CREATE VIEW authority in +the target DB and SELECT on sources; REFRESH/ALTER/DROP require ownership or DB +administrative authority. No new public privilege enum is required in P1. +SHOW follows the same object visibility policy; run errors are sanitized. + +Scheduled refresh executes as the stored owner user/role IDs and checks current +existence, active account, role membership and source privileges each run. +Internal executor session overrides carry identity but must not be mistaken for +proof that a live privilege check happened. Owner deletion/revocation suspends +new refresh; privilege restoration can resume without replacing last-good rows. +Restored objects with unresolvable owners remain paused. Automatic rewrite never +expands the caller's access: it checks original-query and MV privileges. + +The public write denial is enforced in planner DML, DDL kind checks, and compile +execution after re-resolution, including prepared, LOAD DATA, foreign-key +cascade, maintenance/index and restore paths. Refresh uses an unforgeable +process-internal capability bound to account/MV/epoch/TxnOperator and exact +target relation. It is not a session variable, SQL hint, public role, or general +"skip permissions" option. Engine direct writes must remain restricted to the +same trusted internal boundary; all internal relation writers are audited. + +Consumer audit must include `SHOW TABLES`, SHOW CREATE, DESCRIBE, +information_schema TABLES/COLUMNS/VIEWS, grants, engine plan/definition conversion, +`mo-dump`, backup, restore, clone, publication/subscription, stats/ANALYZE, DROP +DATABASE/ACCOUNT and all object-kind switches. P1 reports MVs as BASE TABLE to +standard information_schema TABLES for MySQL compatibility, excludes them from +logical VIEWS, and exposes MV-specific metadata via SHOW. Publication and clone +of an MV are rejected initially. Logical export emits CREATE MV plus its refresh +policy; it does not replay data as user INSERTs into a read-only object. + +# Git4Data Integration and Data-Version Semantics + +Git4Data should supply version/snapshot identity, historical-read resolution, +retention lifecycle and branch validation. Do not invent a second time-travel +engine for MVs. A branch name alone is not a complete data version. + +| Value | Meaning | Authoritative owner | +|---|---|---| +| `definition_epoch` | SELECT/output/security definition and P1 policy fence | MV DDL/catalog | +| `source_version` | Data read: LIVE_TS, or later resolved named/branch snapshot | Txn/snapshot/Git4Data; persisted by refresh | +| `successful_sequence` / `run_id` | Requested refresh that published | MV service; not a source-data version | +| publication commit C | When output became visible | Txn commit, never source TS or wall clock | +| W | Complete source-change observation frontier | Future engine/change consumer | + +P1 stores a LIVE_TS descriptor with the full physical/logical source timestamp +and dependency identities. It does not create a named snapshot for every tick. +The active transaction protects its read snapshot during refresh; retaining S +after commit is provenance, not a source-history reservation. Record the +publishing transaction/run ID in the atomic publication. Obtain C from the +actual transaction outcome for diagnostics if needed; do not write an unknown +future commit TS into the transaction. Coverage needs S, not C. + +Concrete uses and release placement: + +1. **P1 provenance:** SHOW identifies the exact source version. Do not truncate + arbitrary MVCC timestamps to PhysicalTime. Existing named-snapshot APIs may + define a physical-only boundary: obey their owner semantics rather than + assume that boundary round-trips every native timestamp. +2. **Branch experiments:** a native branch table can be treated as a separately + bound source after its lineage/identity lifecycle is verified. Create the MV + against that branch to compare definitions and results before a release. + P1 never automatically retargets the MV to main or merges results. Unknown + branch-owner kinds are rejected; merge/COPY/delete must obey the source-DDL + fences. Git4Data remains owner of branch bookkeeping. +3. **P1.1 historical refresh:** a separately reviewed extension can add proposed + `REFRESH MATERIALIZED VIEW mv AT SNAPSHOT 'baseline'`. All sources bind at + one existing account/database-scope snapshot S; the current MV publishes at + later C. This extension is manual-only and stores resolved snapshot identity, + scope and name. Snapshot name reuse does not reuse identity. P1 does not yet + admit this syntax or historical bindings. +4. **Output history:** MO snapshots/PITR can eventually read old MV result + versions after object-kind consumers are extended. A source snapshot S and + an output snapshot after C are different versions. Historical output reads + validate identities at historical Q, not require sources to exist in the + current catalog. P1 rejects historical MV reads until that contract is proven. +5. **P3 deltas and validation:** branch Diff can compare two pinned versions + offline and help evaluate incremental maintenance. It can scan/spill and + requires schema/key/lineage compatibility, so never run public DIFF for every + optimizer candidate. Reuse typed lower-level change collection only after + proving complete interval semantics. Pick/Merge cannot substitute for SUM + retraction, deletion handling or a multi-table incremental join algorithm. + +Historical refresh acquires an identity-scoped retention reference before +reading and holds it through source-read completion. A persistent definition +promising future reruns at a named snapshot needs a durable reference until that +promise is removed. The P1.1 extension chooses RESTRICT for DROP of a referenced +named snapshot. PITR shrink, lineage GC, restore, quota and cancellation must +consume the same reference contract. Do not mark MV retention as `kind='branch'` +or keep every routine P1 source timestamp indefinitely. + +Registry catalog identity -> SNAPSHOT/lineage barrier -> MV dependency guard +is the additional outer lock order whenever historical/branch operations +participate. Use the snapshot owner's existing transaction-mode-specific +lock/write-fence selection. Expose a transaction-aware owner adapter rather than +import frontend helpers into pkg/mv or open unrelated BackgroundExec transactions. + +A named snapshot proves stable historical input, not absence of changes in the +live table. An MV on branch B cannot rewrite a query on main A merely because +they share an ancestor or schema version. Match the full source-version +descriptor. Current-source strict rewrite still needs S-to-Q coverage proof; +historical/branch rewrite remains a separately reviewed P4 contract. + +# Transparent Rewrite: Separate P2 Contract + +## Safe candidate matching + +Match bound logical expressions, not SQL strings. Fingerprints include stable +source identity, column sequence/type/scale/collation, function identity, +normalized predicates, GROUP BY keys and semantic SQL context. Hash equality is +only candidate lookup: compare the structures to prevent collisions. Prepared +parameters remain typed placeholders and are validated per execution. + +Start with single-table Scan/Filter/Project/Aggregate plans. Require query +predicates equal to MV pre-aggregation predicates in the first rewrite closure; +later predicate containment requires a separate typed implication proof. +Residual filters can only reference available grouping/projection columns. +Apply HAVING after the reconstructed aggregate. No LIMIT push-through, outer +join changes, DISTINCT rollup, or union compensation in P2. + +For aggregate rollup, query group keys must be a subset of MV group keys. +SUM merges sums; COUNT merges counts rather than counting MV rows; MIN/MAX +merge extrema. AVG requires independently stored SUM and COUNT of the same +nullable input and finalization with zero-count/NULL, precision, overflow and +rounding behavior matching MO. Never AVG finalized averages. Empty-input scalar +COUNT returns zero, not NULL from SUM of an empty MV. Start with exact numeric +types whose widened intermediate/final casts are proved equivalent; floating +SUM/AVG and reassociation that changes overflow/rounding remain excluded. + +## Freshness proof + +Keep three values distinct: source schema version, data coverage timestamp S, +and source completeness frontier W. Existing catalog DDL watermarks do not prove +absence of DML. An asynchronous change consumer with W < Q does not prove that +there were no changes before query snapshot Q. + +Strict rewrite requires a visible published result at Q and an authoritative +proof that every source has identical query-relevant data between S and Q, +plus unchanged source identities/schema. Introduce a narrowly scoped proposed +`ProveNoCommittedChanges(source, S, Q)` engine capability returning +`UNCHANGED / CHANGED / UNKNOWN`; UNKNOWN falls back. Its contract includes +inserts, deletes, updates, identity changes, history GC, replay and complete +observation through Q. `CollectChanges`/ISCP are investigation inputs, not an +automatic implementation of this proof. The API's implementation needs a +separate reviewed change-coverage protocol before strict rewrite is enabled. +Do not add synchronous per-MV work to every base-table commit to fake freshness. + +An optional session stale mode can be designed without that oracle: proposed +`mv_rewrite_max_staleness_seconds`, default 0 meaning **strict**, allows a +successful result only when S is not newer than Q and age derived from source +TS is within the explicit positive bound. This is snapshot-age permission, not +a guarantee about refresh finish time. EXPLAIN reports the chosen MV, S, bound, +matched shape, and rejection reason. P1 introduces neither rewrite mode. + +Only rewrite standalone read-only SELECT with no local writes, historical +binding, external security context, locking clause, or unsupported construct. +Add a dedicated query-building pass before physical/index selection, with +coherent column-tag and node remapping. Preserve the original plan as fallback. +Check fresh coverage at every execution, including prepared execution; a cached +successful rewrite is not a reusable freshness authorization. Admission consumes +the current transaction's catalog read stamp and workspace identity. + +## Cost and bounds + +Reverse dependency lookup is indexed, account-scoped, and capped at 32 candidates +and 10 ms per query. These are proposed initial budgets, not benchmark findings. +Budget expiration leaves the original plan. There is no permanent global plan +cache in the first rewrite closure; statement-local descriptors are released on +completion. Cost comparison uses existing statistics but correctness never +depends on cost estimates. Unknown MV statistics use the original plan. + +# Incremental and Partition Refresh Roadmap + +Partition refresh is partition-change tracking and recomputation, not generally +row-delta maintenance. Define stable partition IDs/generations and a mapping from +source partitions to output groups before shipping it. A changed unpartitioned +join dimension may require refreshing every output partition; never advance its +coverage after only the first partition, as highlighted by MVVersionManager. + +For a first single-table incremental aggregate implementation, bootstrap a full +result at S, retain source change history, then apply a gap-free interval with +the storage API's actual endpoint convention. Persist applied interval/epoch and +aggregate results in one transaction. Use `DataRetriever.GetToTS()` for the +applied source bound, not the consumer transaction's newer SnapshotTS. +Retry cannot double-count an interval; history loss fails closed and triggers a +full refresh. Retention reservations must precede releasing the bootstrap source +snapshot. Deletes/updates need before-images or sufficient retained row state. + +COUNT/SUM can use signed deltas with proved numeric semantics; AVG stores +SUM/COUNT; NULL-only and disappearing groups need input-count state. MIN/MAX +cannot generally retract a deleted extremum without additional state or group +recomputation. DISTINCT/HLL/BITMAP and multi-table delta joins remain separate +features. On-commit synchronous refresh is not part of this proposal's first +releases because it increases base-write latency and transaction lock scope. + +# Resource Model and Operational Defaults + +P1 configuration defaults are proposals: + +| Resource | Bound / owner | +|---|---| +| MVs per account | 128; catalog admission; configurable with maximum checked by admin | +| Sources per MV | 16; binder; repeated references deduplicated for dependency count | +| Definition SQL / columns | 64 KiB / 256 columns; binder before persistence | +| Active refreshes | 1/account/CN and 2/CN; cancellable admission; cross-CN duplicate computation may conflict and abort | +| Waiting requests | 1 coalesced request/MV; no interval backlog | +| Refresh timeout | 300 seconds; executor context and transaction cleanup | +| Transient transaction retries | 2; cancellation-aware, new transaction each attempt | +| Output budget | 512 MiB logical encoded output per attempt in initial P1; measured in writer before commit; failure rolls back | +| Spill | Reuse query memory/temporary-disk admission; no independent unlimited refresh pool | +| History | Latest 100 attempts/MV, max 7 days; bounded catalog cleanup using existing task infra | +| Error text | At most 1 KiB sanitized text; never connection secrets or raw sensitive rows | +| Reconciliation | Indexed pages of 128 intents, existing task infrastructure, cancellation between pages | + +Full refresh costs O(source scan + old-result delete + new-result write). +MVCC temporarily retains old and new rows plus tombstones; compaction and +transaction memory are material costs. Timeout and encoded-output limits do not +alone bound total transaction workspace, so the existing memory/disk admissions +must account for it and reject before resource exhaustion. Long snapshots retain +history. User DML has no new per-row MV-maintenance path in P1; only dependency +DDL and scheduled background work add overhead. No performance improvement +percentage is asserted without a representative no-profile benchmark. + +Use low-cardinality metrics: active/queued refreshes by outcome, refresh duration, +admission rejects, retries, and stale/invalid rewrite rejections. Per-object +diagnostics belong in bounded SHOW history, not metric labels with arbitrary +account/view/run names. Failed refreshes expose last-good S and a clear error. + +# Compatibility, Upgrade, Backup and Rollback + +Feature gate defaults off until all relevant CN/TN/catalog consumers support the +new format/relkind/task code. Creation/refresh use durable cluster capability +admission; a process-local switch alone is insufficient. Capability selection +must prevent old CNs from claiming new tasks and receiving MV plans through +distributed execution. New capability bits and protocol numbers are allocated +through existing owners during implementation, not fabricated in this RFC. + +P1's task publication owner must check installed MV catalogs and the existing +common protocol inventory before creating the reconcile cron metadata. Merely +registering the executor on a new CN does not exclude an old CN from claiming +that globally visible task. The existing CN registration loop owns admission +retries and shutdown; no second scheduler or readiness worker is introduced. +Case C12 requires zero new cron/async task metadata while old nodes remain. + +Install catalog tables through fresh bootstrap and a new idempotent upgrade +entry. Keep ordinary-view tables and their inactive gates unchanged. A crash +mid-upgrade is repairable; no MV object can be created before admission succeeds. +With MVs present, old binaries must not serve them as writable ordinary tables. +Downgrade requires disabling schedules/rewrite, draining refresh transactions, +dropping MVs or exporting results into explicitly created ordinary tables, then +passing a catalog preflight. An old binary need not understand MV metadata. + +Physical backup includes result rows, definitions, dependencies and publication +state from a consistent snapshot. Restored scheduling starts paused; rebuild +bindings/owners under restored account/database/table identities, regenerate +dependency indexes, and require a new full refresh before enabling scheduled +runs or rewrite. Old in-flight task IDs are invalid. Direct stored-result reads +are allowed only after restored identities/privileges are validated, with their +original S marked historical. P1 table/database selective restore into live +dependent objects is rejected as described above; account/cluster restore uses +the paused recovery path. Backup and PITR restore must not resurrect workers. + +Rollback of the feature while staying on capable binaries keeps direct stored +reads available but disables new CREATE/refresh/rewrite after draining work. +DROP remains available for cleanup. A failed initialization never publishes a +half-created relation without its metadata: relation, dependencies, grants and +desired schedule intent commit together or roll back together. + +# Implementation Map and Reviewable Work Units + +All new filenames and symbols are proposed. Existing paths below were inspected. + +| Work unit | Existing files to change / proposed additions | Completion boundary | +|---|---|---| +| W1 grammar and definition | `pkg/sql/parsers/dialect/mysql/mysql_sql.y`, tree AST and lexer keyword maps; new `tree/materialized_view.go`; `pkg/sql/plan/build.go`, `build_ddl.go`; new `plan/materialized_view.go`; `proto/plan.proto` | Parse/format round-trip; definition rejects unsupported constructs; typed output and captured context | +| W2 catalog and capabilities | `pkg/catalog/types.go`; new `catalog/materialized_view.go`; `pkg/frontend/predefined.go`; new bootstrap version entries; engine plan/definition conversion and relkind consumers | Atomic CREATE/DROP; version/identity-qualified catalogs; old-reader exclusion | +| W3 DDL/security/read-only | `pkg/frontend/authenticate.go`, `mysql_cmd_executor.go`; `pkg/sql/compile/compile.go`, `ddl.go`; DML builders and table resolution in `query_builder.go`; `pkg/util/sysview/` | Public SQL, prepared, internal and restore boundaries enforce kind and privileges | +| W4 atomic refresh | new `pkg/mv/{types,catalog,refresh}.go`; existing `pkg/util/executor` transaction options | One source SI snapshot; conflict-safe all-or-nothing replacement; durable publication record | +| W5 scheduling/recovery | `proto/task.proto`, `pkg/cnservice/server_task.go`; task-service adapter and `pkg/mv/schedule.go` | Desired-policy reconciliation, bounded tasks, idempotent restart/cancel/drop | +| W6 lifecycle/export | bootstrap, backup/restore/clone/publication owners, SHOW and dump consumers | Complete same-account/database removal; paused restore; safe export/downgrade | +| W7 P2 only | new `pkg/sql/plan/mv_rewrite.go`, `query_builder.go`, frontend prepared-execution guards; later engine freshness proof API | Typed matching, explicit freshness permission, fallback, execution-time revalidation | +| W8 P3 only | `pkg/iscp`, engine change-history owners, future aggregate-state implementation | Bootstrap retention, gap-free delta apply, idempotent checkpoint and retraction | + +W1-W6 together constitute P1. No half-feature ships behind public syntax without +its DDL, write denial, recovery and compatibility closure. A new protocol field +requires updating generated readers/writers and distributed plan consumers in +the same implementation unit. Exact IDs are assigned by those PRs. + +# Acceptance and Counterexample Matrix + +The [validation plan](../design/materialized_view_validation.md) maps StarRocks +documentation to MO SQL fixtures, independent result oracles and paired +performance experiments. Future implementation tests are requirements, not +results of this design task. +Use minimum data, fake clocks and injected transaction barriers, not sleeps. + +| Contract | Small deterministic oracle | Layer | +|---|---|---| +| Syntax / errors | All proposed statements round-trip; ordinary VIEW unaffected; reject each unsupported shape | parser UT + SQL BVT | +| Bound definition | Expanded star, renamed alias, NULL/decimal/date output, SQL mode/timezone restored; duplicate names rejected | planner UT + BVT | +| Full-refresh correctness | Independent SELECT at captured S equals stored output, including inner join with duplicate matches, empty input and all-NULL aggregates | SQL integration | +| Atomic visibility | Pause after DELETE and after INSERT before commit; another session sees only old result; after commit sees complete new result | integration barriers | +| Failure rollback | Inject delete/insert/metadata-write/commit errors; old rows and successful run ID/S unchanged | executor UT + integration | +| Source snapshot | Commit source updates between refresh statements; all sources/results still reflect S under SI | txn integration | +| Duplicate/concurrent runs | Same run twice; two distinct runs conflict; newer sequence commits before old worker retries; old worker cannot regress coverage | UT + two-CN integration | +| Ambiguous commit | Drop acknowledgment after commit; restart resolves outcome by run ID and does not replace SUCCESS with FAILED | restart/fault integration | +| DDL closure | Race CREATE MV with source ALTER/DROP, MV DROP with refresh, DB/account removal with cron; name/physical-ID reuse rejected | deterministic multi-CN barriers | +| Read-only | INSERT, LOAD DATA, UPDATE, DELETE, TRUNCATE, generic ALTER/DROP TABLE, index changes, prepared and internal unauthorized attempts rejected | planner/compile UT + BVT | +| Tenant/auth | Identical names and colliding IDs in two tenants; role revoked/deleted; owner restored with different ID; catalog reads never cross accounts | security BVT | +| Schedule | Fake-clock missed ticks coalesce; crash after intent commit; task survives CN exit; DROP fences orphan tasks | task UT + restart | +| Admission/cleanup | Timeout/cancel during admission, scan, write, shutdown and retry; admission/Result/spill resources released exactly once | UT + race in owning closures | +| Upgrade/backup | Catalog upgrade twice, interrupted migration, mixed old/new CN exclusion, backup restore paused, downgrade with objects refused | focused compatibility integration | +| P2 shape | Positive exact match and rollup; nearer negatives: different predicate/type/collation, missing dimension, DISTINCT, HAVING ordering, AVG-of-AVG, NULL/empty COUNT | typed plan UT + differential SQL | +| P2 freshness | Source DML after S with no schema change, W= deadline: + raise TimeoutError(description) + time.sleep(0.25) # Poll an observable phase, never assume elapsed readiness. + + +class Fixture: + def __init__(self, args): + self.args = args + self.root = pathlib.Path(args.work_dir).resolve() + self.root.mkdir() # Refuse residue; never delete another fixture's data. + self.processes = [] + self.logs = [] + self.started = time.monotonic() + self.report = {"passed_cases": [], "observations": {}, "binaries": {}, "sql_observations": {}} + for key in ("service", "old_service", "probe"): + path = pathlib.Path(getattr(args, key)).resolve() + with path.open("rb") as binary: + digest = hashlib.sha256() + for chunk in iter(lambda: binary.read(1 << 20), b""): + digest.update(chunk) + self.report["binaries"][key] = { + "path": str(path), "sha256": digest.hexdigest() + } + self.configure() + probe_log = (self.root / "probe.log").open("w") + self.logs.append(probe_log) + self.probe = subprocess.Popen( + [args.probe], stdin=subprocess.PIPE, stdout=subprocess.PIPE, + stderr=probe_log, text=True, + ) + + def sql(self, statement, old=False, query=False, allow_error=False): + port = 6102 if old else 6101 + dsn = f"dump:111@tcp(127.0.0.1:{port})/?timeout=2s&readTimeout=35s&writeTimeout=35s&time_zone=%27%2B00%3A00%27" + self.probe.stdin.write(json.dumps({"dsn": dsn, "sql": statement, "query": query}) + "\n") + self.probe.stdin.flush() + if not select.select([self.probe.stdout], [], [], 40)[0]: + raise TimeoutError("SQL probe failed to honor its operation deadline") + line = self.probe.stdout.readline() + if not line: + raise RuntimeError("SQL probe exited") + response = json.loads(line) + key = ("old: " if old else "current: ") + statement + observation = self.report["sql_observations"].setdefault(key, {"attempts": 0, "changes": []}) + observation["attempts"] += 1 + if not observation["changes"] or observation["changes"][-1] != response: + observation["changes"].append(response) + if response["error"] and not allow_error: + raise RuntimeError(statement + ": " + response["error"]) + return response if allow_error else response["rows"] + + def q(self, statement, **kwargs): + return self.sql(statement, query=True, **kwargs) + + def passed(self, name, observation=None): + self.report["passed_cases"].append(name) + if observation is not None: + self.report["observations"][name] = observation + print("PASS", name, flush=True) + + def configure(self): + template = pathlib.Path("etc/launch") + for name in ("log", "tn", "cn"): + text = (template / (name + ".toml")).read_text() + text = text.replace("./mo-data", str(self.root / "data")) + text = text.replace("disableMetric = false", "disableMetric = true") + text = text.replace("enable-auto-id-cache = true", "enable-auto-id-cache = false") + text = text.replace("status-port = 7001", "status-port = " + {"log": "7301", "tn": "7302", "cn": "7303"}[name]) + if name == "cn": + text = text.replace("[cn]\n", "[cn]\nauto-upgrade = true\n") + (self.root / "cn.toml").write_text(text + "\n[cn.frontend]\nport=6101\n") + old = text.replace("dd1dccb4", "ee1dccb4").replace("18000", "20000") + old = old.replace("status-port = 7303", "status-port = 7304") + (self.root / "old.toml").write_text(old + "\n[cn.frontend]\nport=6102\n") + else: + (self.root / (name + ".toml")).write_text(text) + (self.root / "storage.toml").write_text( + f'logservices=["{self.root}/log.toml"]\ntnservices=["{self.root}/tn.toml"]\n' + ) + + def start(self, label, old=False, storage=False, fault="", role=None): + if storage: + # The regular -launch entry requires at least one CN. Separate + # native LOG/TN processes let a CN crash leave storage running. + processes = [] + for service, port in (("log", 32001), ("tn", 19000)): + p = self.start(label + "-" + service, old=old, role=service) + processes.append(p) + + def listening(): + if p.poll() is not None: + raise RuntimeError(f"{service} exited: {p.returncode}") + try: + with socket.create_connection(("127.0.0.1", port), timeout=1): + return True + except OSError: + return False + wait_for(service + " TCP readiness", listening) + return processes + log = (self.root / (label + ".log")).open("w") + self.logs.append(log) + binary = self.args.old_service if old else self.args.service + env = dict(os.environ) + env.pop("MO_MV_STARTUP_FAULT", None) + if fault: + env["MO_MV_STARTUP_FAULT"] = fault + config = role + ".toml" if role else "old.toml" if old else "cn.toml" + args = [binary, "-cfg", str(self.root / config)] + if role is None and not old: + args += ["-debug-http", "127.0.0.1:7603"] + p = subprocess.Popen(args, stdout=log, stderr=subprocess.STDOUT, env=env) + p.fixture_label = label + self.processes.append(p) + return p + + @staticmethod + def stop(p, crash=False): + if isinstance(p, list): + for child in reversed(p): + Fixture.stop(child, crash=crash) + return + if p.poll() is None: + if crash: + p.kill() + else: + p.terminate() + try: + p.wait(timeout=45) + except subprocess.TimeoutExpired: + p.kill() + p.wait() + raise + if crash and p.returncode != -9: + raise RuntimeError(f"expected SIGKILL, got {p.returncode}") + + def ready(self, p, old=False): + def check(): + if p.poll() is not None: + raise RuntimeError(f"server exited: {p.returncode}") + result = self.q("select 1", old=old, allow_error=True) + return result["rows"] == [["1"]] and not result["error"] + wait_for("normal authenticated SQL readiness", check) + + def await_log(self, label, needle, p): + def check(): + if p.poll() is not None: + raise RuntimeError(f"{label} exited: {p.returncode}") + return needle in (self.root / (label + ".log")).read_text(errors="replace") + wait_for(label + ": " + needle, check) + + def native_upgrade(self): + storage = self.start("old-storage", old=True, storage=True) + old = self.start("old-bootstrap", old=True) + self.ready(old, old=True) + assert self.q("select version,state from mo_catalog.mo_version order by create_at desc limit 1", old=True) == [[self.args.old_version, "2"]] + inventory = self.q("select mo_ctl('cn','GetProtocolVersion','')", old=True) + versions = json.loads(inventory[0][0])["result"] + assert versions and all(int(entry.rsplit(":", 1)[1]) == self.args.old_protocol for entry in versions.split(",")), inventory + self.report["old_protocol"] = self.args.old_protocol + self.sql("create database mv_recovery", old=True) + self.sql("create table mv_recovery.facts(id int primary key,v bigint)", old=True) + self.sql("insert into mv_recovery.facts values(1,10),(2,20)", old=True) + assert self.q("select count(*) from mo_catalog.mo_tables where reldatabase='mo_catalog' and relname in ('mo_materialized_views','mo_mv_dependencies','mo_mv_refresh_runs','mo_mv_account_state')", old=True) == [["0"]] + self.passed(f"ordinary authenticated {self.args.old_version} deployment", self.q("select sum(v) from mv_recovery.facts", old=True)) + # Retain the real old CN and LOG/TN while starting the new CN. Catalog + # installation must wait for the protocol barrier across this topology. + current = self.start("new-mixed", fault="mv_catalog_upgrade_after_ddl#2:2::#wait#0##false") + self.await_log("new-mixed", "requires all CNs to support protocol version 119", current) + self.await_log("new-mixed", "materialized view catalogs are not installed", current) + control = self.q("select count(*) from mo_catalog.mo_tables where reldatabase='mo_catalog' and relname in ('mo_materialized_views','mo_mv_dependencies','mo_mv_refresh_runs','mo_mv_account_state')", old=True, allow_error=True) + if not control["error"]: + assert control["rows"] == [["0"]], control + rejected = self.q("select 1", allow_error=True) + # Login waits for the target upgrade state (bounded by the probe's + # context), or reports the explicit earlier tenant-version fence. + assert any(message in rejected["error"] for message in ("tenant upgrade requires", "context deadline exceeded")), rejected + # New executor metadata itself must not enter the old scheduler, even + # though no MV can yet be created. Unknown-executor failures on old CNs + # are not an acceptable way to implement capability exclusion. + for table in ("sys_cron_task", "sys_async_task"): + assert self.q(f"select count(*) from mo_task.{table} where task_metadata_executor=17", old=True) == [["0"]] + assert "executor with code 17 not exists" not in (self.root / "old-bootstrap.log").read_text(errors="replace") + self.passed("old nodes block MV catalog migration and new-CN login remains pending", {"new_login": rejected, "old_catalog_control": control}) + self.passed("mixed old nodes never receive MV cron or asynchronous task metadata") + self.stop(current) + self.stop(old) + self.stop(storage) + storage = self.start("new-storage", storage=True) + current = self.start("new-staged-migration", fault="mv_catalog_upgrade_after_ddl#2:2::#wait#0##false") + + # The startup-only tagged hook waits after the second real DDL. SQL + # login correctly cannot happen yet; inspect the existing debug stack. + def staged(): + if current.poll() is not None: + raise RuntimeError("upgrader exited") + try: + with urllib.request.urlopen("http://127.0.0.1:7603/debug/pprof/goroutine?debug=2", timeout=3) as response: + stack = response.read().decode() + if "v4_0_17.(*versionHandle).HandleClusterUpgrade" in stack and "fault.(*faultEntry).doWithContext" in stack: + (self.root / "interrupted-upgrade.stack").write_text(stack) + return True + except OSError: + return False + return False + wait_for("two catalog DDLs staged before commit", staged, seconds=240) + self.stop(current, crash=True) + self.passed("SIGKILL after two catalog DDLs before migration commit") + current = self.start("new-migration-recovery") + self.ready(current) + self.await_log("new-migration-recovery", "ISCP-Task Start", current) + self.assert_catalogs() + assert self.q("select sum(v) from mv_recovery.facts") == [["30"]] + self.passed("interrupted migration recovers atomically with ordinary data intact") + self.stop(current) + current = self.start("new-migration-repeat") + self.ready(current) + self.assert_catalogs() + self.passed("repeated automatic upgrade has exactly four catalogs and one ready target") + return current + + def assert_catalogs(self): + assert self.q("select version,version_offset,state from mo_catalog.mo_version where version='4.0.17'") == [["4.0.17", "5", "2"]] + assert self.q("select relname,count(*) from mo_catalog.mo_tables where account_id=0 and reldatabase='mo_catalog' and relname in ('mo_materialized_views','mo_mv_dependencies','mo_mv_refresh_runs','mo_mv_account_state') group by relname order by relname") == [ + ["mo_materialized_views", "1"], ["mo_mv_account_state", "1"], ["mo_mv_dependencies", "1"], ["mo_mv_refresh_runs", "1"]] + + def snapshot(self): + # One snapshot includes result rows, source provenance and run status. + return self.q("select m.n,m.s,v.last_run,v.successful_sequence,v.source_physical,v.source_logical,r.status,r.source_physical,r.source_logical from mv_recovery.result m,mo_catalog.mo_materialized_views v,mo_catalog.mo_mv_refresh_runs r where v.account_id=0 and v.database_name='mv_recovery' and v.name='result' and r.account_id=v.account_id and r.mv_id=v.mv_id and r.run_id=v.last_run") + + def enable(self, point, action="wait", argument=0): + self.q("select enable_fault_injection()") + self.q(f"select add_fault_point('{point}',':::','{action}',{argument},'')") + self.q(f"select add_fault_point('mv_probe_waiters',':::','getwaiters',0,'{point}')") + self.q(f"select add_fault_point('mv_probe_count',':::','getcount',0,'{point}')") + + def crash_refresh(self, current, phase, value): + before = self.snapshot() + self.sql(f"update mv_recovery.facts set v={value}") + self.enable("mv_refresh_" + phase) + self.sql("update mo_catalog.mo_materialized_views set next_due=current_timestamp() where account_id=0 and database_name='mv_recovery' and name='result'") + wait_for("refresh " + phase + " barrier", lambda: self.q("select trigger_fault_point('mv_probe_waiters')") == [["1"]], seconds=120) + assert self.q("select trigger_fault_point('mv_probe_count')") == [["1"]] + run = self.q("select run_id,sequence,status from mo_catalog.mo_mv_refresh_runs where account_id=0 and mv_id=(select mv_id from mo_catalog.mo_materialized_views where account_id=0 and database_name='mv_recovery' and name='result') order by sequence desc limit 1")[0] + assert len(run[0]) == 64, run # Actual periodic task, not a manual UUID. + queue = self.q(f"select task_status,task_runner from mo_task.sys_async_task where task_metadata_id='mv:{run[0][:40]}'") + assert len(queue) == 1 and queue[0][0] == "1", queue + committed = self.snapshot() + if phase == "before_commit": + assert committed == before and run[2] == "RUNNING", (before, committed, run) + else: + assert committed[0][:2] == ["2", str(2 * value)] and run[2] == "SUCCEEDED", (committed, run) + assert committed[0][2] == run[0] and committed[0][4:6] == committed[0][7:9], committed + self.stop(current, crash=True) + self.passed("SIGKILL periodic refresh " + phase, {"before": before, "at_barrier": committed, "run": run, "queue": queue}) + current = self.start("recovery-" + phase) + self.ready(current) + recovered = self.snapshot() + if phase == "after_commit": + assert recovered == committed, (committed, recovered) + elif recovered != before: + assert len(recovered) == 1 and recovered[0][:4] == ["2", str(2 * value), run[0], run[1]], recovered + assert recovered[0][6] == "SUCCEEDED" and recovered[0][4:6] == recovered[0][7:9], recovered + # Observe the same durable queue identity being acknowledged (or GC'd) + # after restart. No hand-written task rows or run-state repair. + def replayed(): + result = self.q(f"select task_status from mo_task.sys_async_task where task_metadata_id='mv:{run[0][:40]}'") + return result in ([], [["2"]]) + wait_for("actual task replay acknowledgement", replayed, seconds=240) + after = self.snapshot() + assert len(after) == 1 and after[0][:2] == ["2", str(2 * value)], after + assert after[0][2] == run[0] and after[0][3] == run[1], (run, after) + assert after[0][6] == "SUCCEEDED" and after[0][4:6] == after[0][7:9], after + assert tuple(map(int, after[0][4:6])) > tuple(map(int, before[0][4:6])), (before, after) + if phase == "after_commit": + assert after == committed, (committed, after) # No second publication. + assert self.q("select count(*) from mo_catalog.mo_mv_refresh_runs where run_id='" + run[0] + "'") == [["1"]] + self.passed("restart and same-run replay " + phase, {"after_restart": recovered, "after_ack": after}) + return current + + def run(self): + current = self.native_upgrade() + self.sql("set experimental_materialized_view=1") + self.sql("create materialized view mv_recovery.result refresh every interval 1 day as select count(*) as n,sum(v) as s from mv_recovery.facts") + self.sql("refresh materialized view mv_recovery.result") + initial = self.snapshot() + assert initial[0][:2] == ["2", "30"], initial + # Normal automatic-upgrade startup of an actual old binary must refuse + # the persisted newer cluster before admitting SQL or scheduled work. + old = self.start("unsafe-downgrade", old=True) + wait_for("unsafe old-binary startup refused", lambda: old.poll() is not None, seconds=120) + log = (self.root / "unsafe-downgrade.log").read_text(errors="replace") + fences = (f"cannot startup a old version {self.args.old_version} to join cluster, current version is 4.0.17", + f"requires persisted expression protocol version 119 (local version {self.args.old_protocol})") + reason = next((fence for fence in fences if fence in log), None) + assert old.returncode != 0 and reason, log[-3000:] + assert self.snapshot() == initial + assert self.q("select count(*) from mo_task.sys_async_task where task_metadata_executor=17 and task_runner='ee1dccb4-4d3c-41f8-b482-5251dc7a41bf'") == [["0"]] + self.passed("old binary refuses downgrade with populated periodic MV before SQL/task admission", {"exit_code": old.returncode, "fence": reason}) + # Wait for failed old-node liveness to leave the protocol inventory. + wait_for("old node removed from protocol inventory", lambda: not self.q("select mo_ctl('cn','GetProtocolVersion','')", allow_error=True)["error"], seconds=240) + self.sql("update mv_recovery.facts set v=25") + self.enable("mv_refresh_after_commit", action="echo", argument=1) + self.sql("refresh materialized view mv_recovery.result") + assert self.q("select trigger_fault_point('mv_probe_count')") == [["1"]] + lost = self.snapshot() + assert lost[0][:2] == ["2", "50"] and lost[0][6] == "SUCCEEDED" and lost[0][4:6] == lost[0][7:9], lost + assert self.q("select count(*) from mo_catalog.mo_mv_refresh_runs where status='FAILED'") == [["0"]] + self.q("select disable_fault_injection()") + self.passed("native durable commit response loss resolves to success", lost) + current = self.crash_refresh(current, "before_commit", 40) + current = self.crash_refresh(current, "after_commit", 60) + self.sql("drop materialized view mv_recovery.result") + self.sql("drop database mv_recovery") + for table in ("mo_materialized_views", "mo_mv_dependencies", "mo_mv_refresh_runs"): + assert self.q("select count(*) from mo_catalog." + table) == [["0"]] + # Queue completion precedes HAKeeper's periodic GC. A completed row is + # not an active task leak; require terminal status, then actual removal. + assert self.q("select count(*) from mo_task.sys_async_task where task_metadata_id like 'mv:%' and task_status<>2") == [["0"]] + wait_for("completed per-view task GC", lambda: self.q("select count(*) from mo_task.sys_async_task where task_metadata_id like 'mv:%'") == [["0"]], seconds=60) + self.passed("native fixture removes MV rows, dependencies, history and per-view tasks") + + def close(self): + errors = [] + for process in reversed(self.processes): + try: + self.stop(process) + except Exception as error: + errors.append(str(error)) + self.probe.stdin.close() + try: + self.probe.wait(timeout=5) + except subprocess.TimeoutExpired: + self.probe.kill() + self.probe.wait() + for log in self.logs: + log.close() + if errors: + self.report["cleanup_errors"] = errors + self.report["process_exits"] = {p.fixture_label: p.returncode for p in self.processes} + self.report["elapsed_seconds"] = time.monotonic() - self.started + (self.root / "results.json").write_text(json.dumps(self.report, indent=2) + "\n") + if errors: + raise RuntimeError(errors) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--service", required=True) + parser.add_argument("--old-service", required=True) + parser.add_argument("--old-version", default="4.0.16", help="catalog version of the pinned old binary") + parser.add_argument("--old-protocol", type=int, default=118, + help="expected protocol of the pinned old binary (118 by default)") + parser.add_argument("--probe", required=True) + parser.add_argument("--work-dir", required=True) + args = parser.parse_args() + fixture = Fixture(args) + try: + fixture.run() + except BaseException as error: + fixture.report["error"] = repr(error) + raise + finally: + fixture.close() + + +if __name__ == "__main__": + main() diff --git a/optools/run_bvt_group.sh b/optools/run_bvt_group.sh index 1984aac8bfb6b..3d7b2bdb0db5c 100644 --- a/optools/run_bvt_group.sh +++ b/optools/run_bvt_group.sh @@ -70,3 +70,13 @@ printf '%s\n' "${included_scripts[@]}" cd "${tester_dir}" ./run.sh -n -g -o -p "${case_root}" -i "${include_list}" "${resource_args[@]}" + +# Native MV checks need two independently addressed CNs and typed SQL oracles. +# Run once, after mo-tester's global restore/account fixtures have finished. +if (( group_id == 0 )); then + repo_root=$(cd "${case_root}/../../.." && pwd) + if [[ -f "${repo_root}/test/materialized_view/main.go" ]]; then + bash "${repo_root}/optools/run_materialized_view_bvt.sh" \ + "${repo_root}" "${tester_dir}/report/materialized_view" + fi +fi diff --git a/optools/run_materialized_view_bvt.sh b/optools/run_materialized_view_bvt.sh new file mode 100644 index 0000000000000..6c08f0c6fb1a7 --- /dev/null +++ b/optools/run_materialized_view_bvt.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash +# SQL contract checks reuse the existing multi-CN BVT deployment. Performance +# and restart experiments remain separate, explicitly invoked validation modes. +set -euo pipefail +if [[ $# != 2 ]]; then + echo "Usage: $0 " >&2 + exit 2 +fi +repo_root=$(cd "$1" && pwd) +mkdir -p "$2" "${repo_root}/coverage" +report_dir=$(cd "$2" && pwd) +coverage_dir=$(cd "${repo_root}/coverage" && pwd) +# A rerun must not accept a previous success if the client cannot write JSON. +rm -f "${report_dir}/functional.json" "${report_dir}/failure.json" "${report_dir}/multi-cn.json" "${report_dir}/native-probe.json" + +cn_dsn() { + local endpoint port + endpoint=$(docker compose -f "${repo_root}/etc/launch-tae-compose/compose.yaml" \ + --profile launch-multi-cn port "$1" 6001) + port=${endpoint##*:} + [[ "${port}" =~ ^[0-9]+$ ]] + printf 'dump:111@tcp(127.0.0.1:%s)/?timeout=5s&readTimeout=330s&writeTimeout=330s' "${port}" +} + +# Overrides support an existing local deployment without starting more servers. +primary_dsn=${MV_BVT_DSN:-$(cn_dsn cn-0)} +second_dsn=${MV_BVT_SECOND_DSN:-$(cn_dsn cn-1)} +build_dir=$(mktemp -d) +trap 'rm -rf "${build_dir}"' EXIT +cd "${repo_root}" +# Match mo-service's default -cover mode so covdata can combine the producer. +CGO_ENABLED=0 go build -mod=readonly -cover -covermode=set \ + -o "${build_dir}/mv-validation" ./test/materialized_view +CGO_ENABLED=0 go build -mod=readonly -cover -covermode=set \ + -o "${build_dir}/mv-native-probe" ./test/materialized_view/native_probe +export GOCOVERDIR="${coverage_dir}" +# The same JSON bridge drives the destructive native recovery suite. Exercise +# its public stream/session/error contract on this existing deployment too; +# its coverage counters join the unchanged UT/BVT coverage aggregation. +python3 "${repo_root}/test/materialized_view/native_probe/check.py" \ + "${build_dir}/mv-native-probe" "${primary_dsn}" > "${report_dir}/native-probe.json" +"${build_dir}/mv-validation" -dsn "${primary_dsn}" -functional \ + -output "${report_dir}/functional.json" +"${build_dir}/mv-validation" -dsn "${primary_dsn}" -edge-check \ + -output "${report_dir}/failure.json" +"${build_dir}/mv-validation" -dsn "${primary_dsn}" -second-dsn "${second_dsn}" \ + -output "${report_dir}/multi-cn.json" +# Fail closed if a mode exits without its nonempty, successful evidence report. +python3 - "${report_dir}" <<'PY' +import json +import pathlib +import sys + +probe = json.loads((pathlib.Path(sys.argv[1]) / "native-probe.json").read_text()) +if probe != {"runs": [{"passed_requests": 9, "process_exit": 0}] * 2}: + raise SystemExit("Incomplete materialized-view native SQL bridge checks") +print("Materialized-view native SQL bridge: 2 x 9 requests passed") + +for name in ("functional", "failure", "multi-cn"): + result = json.loads((pathlib.Path(sys.argv[1]) / (name + ".json")).read_text()) + if result.get("error") or not result.get("passed_cases"): + raise SystemExit("Incomplete materialized-view BVT: " + name) + print("Materialized-view BVT:", name, len(result["passed_cases"]), "checks passed") +PY diff --git a/pkg/bootstrap/service_statistics_upgrade_test.go b/pkg/bootstrap/service_statistics_upgrade_test.go index 682d5f209d694..1d1925c5f9959 100644 --- a/pkg/bootstrap/service_statistics_upgrade_test.go +++ b/pkg/bootstrap/service_statistics_upgrade_test.go @@ -28,6 +28,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_13" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_14" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_15" + "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_16" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_6" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_7" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_8" @@ -80,6 +81,7 @@ func TestDoCheckUpgradeQueuesStatisticsRefresh(t *testing.T) { {name: "current_4.0.13", version: "4.0.13", offset: v4_0_13.Handler.Metadata().VersionOffset, upgrade: true}, {name: "current_4.0.14", version: "4.0.14", offset: v4_0_14.Handler.Metadata().VersionOffset, upgrade: true}, {name: "current_4.0.15", version: "4.0.15", offset: v4_0_15.Handler.Metadata().VersionOffset, upgrade: true}, + {name: "current_4.0.16", version: "4.0.16", offset: v4_0_16.Handler.Metadata().VersionOffset, upgrade: true}, {name: "current", version: final.Version, offset: final.VersionOffset}, } { t.Run(test.name, func(t *testing.T) { @@ -115,6 +117,9 @@ func TestDoCheckUpgradeQueuesStatisticsRefresh(t *testing.T) { require.NoError(t, b.doCheckUpgrade(context.Background())) if test.upgrade { hops := []versions.Version{final} + if versions.Compare(test.version, "4.0.16") < 0 { + hops = append([]versions.Version{v4_0_16.Handler.Metadata()}, hops...) + } if versions.Compare(test.version, "4.0.15") < 0 { hops = append([]versions.Version{v4_0_15.Handler.Metadata()}, hops...) } diff --git a/pkg/bootstrap/upgrade.go b/pkg/bootstrap/upgrade.go index a14c3718e8962..fd5b118047547 100644 --- a/pkg/bootstrap/upgrade.go +++ b/pkg/bootstrap/upgrade.go @@ -35,6 +35,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_14" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_15" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_16" + "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_17" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_2" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_3" "github.com/matrixorigin/matrixone/pkg/bootstrap/versions/v4_0_4" @@ -79,6 +80,7 @@ func (s *service) initUpgrade() { s.handles = append(s.handles, v4_0_14.Handler) s.handles = append(s.handles, v4_0_15.Handler) s.handles = append(s.handles, v4_0_16.Handler) + s.handles = append(s.handles, v4_0_17.Handler) } func (s *service) getFinalVersionHandle() VersionHandle { diff --git a/pkg/bootstrap/versions/v4_0_17/upgrade.go b/pkg/bootstrap/versions/v4_0_17/upgrade.go new file mode 100644 index 0000000000000..0735ad456471e --- /dev/null +++ b/pkg/bootstrap/versions/v4_0_17/upgrade.go @@ -0,0 +1,84 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package v4_0_17 + +import ( + "context" + "strings" + + "github.com/matrixorigin/matrixone/pkg/bootstrap/versions" + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "github.com/matrixorigin/matrixone/pkg/util/fault" +) + +var Handler = &versionHandle{ + metadata: versions.Version{ + Version: "4.0.17", + MinUpgradeVersion: "4.0.16", + UpgradeCluster: versions.Yes, + UpgradeTenant: versions.No, + VersionOffset: uint32(len(catalog.MaterializedViewCatalogDDLs) + 1), + RequiredProtocolVersion: defines.MORPCVersion119, + }, +} + +type versionHandle struct { + metadata versions.Version +} + +func (v *versionHandle) Metadata() versions.Version { + return v.metadata +} + +func (v *versionHandle) Prepare(_ context.Context, txn executor.TxnExecutor, _ bool) error { + txn.Use(catalog.MO_CATALOG) + return nil +} + +func (v *versionHandle) HandleTenantUpgrade(_ context.Context, tenantID int32, txn executor.TxnExecutor) error { + return nil +} + +func (v *versionHandle) HandleClusterUpgrade(ctx context.Context, tx executor.TxnExecutor) error { + // This version has no tenant-upgrade phase, so the framework's tenant + // protocol check does not run. Fence old CNs before installing MV catalogs. + if err := versions.CheckCommonProtocolVersion(tx, v.metadata.RequiredProtocolVersion); err != nil { + return err + } + for _, ddl := range catalog.MaterializedViewCatalogDDLs { + ddl = strings.Replace(ddl, "create cluster table ", "create cluster table if not exists ", 1) + result, err := tx.Exec(ddl, executor.StatementOption{}.WithAccountID(catalog.System_Account)) + if err != nil { + return err + } + result.Close() + fault.TriggerFaultWithContext(ctx, "mv_catalog_upgrade_after_ddl") + } + // Format 1 lacks the captured division context. Pause legacy policies and + // fence queued work without guessing semantics or rewriting stored rows. + r, err := tx.Exec("update mo_catalog.mo_materialized_views set interval_seconds=0,next_due=null,epoch=epoch+1 where interval_seconds>0 and cast(json_extract(definition,'$.format_version') as int)=1", executor.StatementOption{}.WithAccountID(catalog.System_Account)) + if err != nil { + return err + } + r.Close() + return nil +} + +func (v *versionHandle) HandleCreateFrameworkDeps(_ executor.TxnExecutor) error { + return moerr.NewInternalErrorNoCtxf("Only v1.2.0 can initialize upgrade framework, current version is:%s", v.metadata.Version) +} diff --git a/pkg/bootstrap/versions/v4_0_17/upgrade_test.go b/pkg/bootstrap/versions/v4_0_17/upgrade_test.go new file mode 100644 index 0000000000000..1f492fbd2987c --- /dev/null +++ b/pkg/bootstrap/versions/v4_0_17/upgrade_test.go @@ -0,0 +1,85 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package v4_0_17 + +import ( + "context" + "errors" + "strings" + "testing" + + "github.com/matrixorigin/matrixone/pkg/common/mpool" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewUpgrade(t *testing.T) { + require.Equal(t, "4.0.17", Handler.Metadata().Version) + require.Equal(t, defines.MORPCVersion119, Handler.Metadata().RequiredProtocolVersion) + for _, scenario := range []string{"ready", "DDL failure", "old CN", "protocol query failure"} { + t.Run(scenario, func(t *testing.T) { + calls := 0 + injected := errors.New("catalog creation failed") + mp := mpool.MustNewZeroNoFixed() + t.Cleanup(func() { + defer mpool.DeleteMPool(mp) + require.Zero(t, mp.CurrNB()) + }) + tx := executor.NewMemTxnExecutor(func(sql string) (executor.Result, error) { + if sql == "SELECT mo_ctl('cn', 'GetProtocolVersion', '')" { + if scenario == "protocol query failure" { + return executor.Result{}, injected + } + value := `{"result":"cn-a:119,cn-b:119"}` + if scenario == "old CN" { + value = `{"result":"cn-a:119,cn-b:118"}` + } + r := executor.NewMemResult([]types.Type{types.T_varchar.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendStringRows(r, 0, []string{value})) + return r.GetResult(), nil + } + calls++ + if calls <= 4 { + require.True(t, strings.HasPrefix(sql, "create cluster table if not exists mo_catalog.mo_")) + } else { + require.Contains(t, sql, "set interval_seconds=0,next_due=null,epoch=epoch+1") + require.Contains(t, sql, "cast(json_extract(definition,'$.format_version') as int)=1") + } + if scenario == "DDL failure" && calls == 2 { + return executor.Result{}, injected + } + return executor.Result{}, nil + }, nil) + err := Handler.HandleClusterUpgrade(context.Background(), tx) + switch scenario { + case "old CN": + require.ErrorContains(t, err, "requires all CNs to support protocol version 119") + require.Zero(t, calls, "old CN must block before the first catalog DDL") + case "protocol query failure": + require.ErrorIs(t, err, injected) + require.Zero(t, calls) + case "DDL failure": + require.ErrorIs(t, err, injected) + require.Equal(t, 2, calls) + default: + require.NoError(t, err) + require.Equal(t, 5, calls) + } + }) + } +} diff --git a/pkg/catalog/materialized_view.go b/pkg/catalog/materialized_view.go new file mode 100644 index 0000000000000..88ebecb149e45 --- /dev/null +++ b/pkg/catalog/materialized_view.go @@ -0,0 +1,197 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package catalog + +import ( + "encoding/json" + "time" + + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/pb/plan" +) + +const SystemMaterializedViewRel = "m" +const MVDefinitionFormatVersion = 2 + +const MaterializedViewProperty = "mo_materialized_view" +const MO_MATERIALIZED_VIEWS = "mo_materialized_views" +const MO_MV_DEPENDENCIES = "mo_mv_dependencies" +const MO_MV_REFRESH_RUNS = "mo_mv_refresh_runs" +const MO_MV_ACCOUNT_STATE = "mo_mv_account_state" + +func IsMaterializedViewDatabase(database string) bool { + switch database { + case "mo_catalog", "information_schema", "system", "mysql", "mo_task", "system_metrics": + return false + default: + return true + } +} + +type MVSource struct { + AccountID uint32 `json:"account_id"` + DatabaseID uint64 `json:"database_id"` + TableID uint64 `json:"table_id"` + LogicalID uint64 `json:"logical_id"` + Version uint32 `json:"version"` + Database string `json:"database"` + Table string `json:"table"` +} + +// MVDefinition is immutable for a stored relation. Runtime coverage and schedule +// are authoritative in mo_materialized_views, not in this property. +type MVDefinition struct { + DivPrecisionIncrement *int32 `json:"div_precision_increment,omitempty"` + TimeZoneKind string `json:"time_zone_kind,omitempty"` + FormatVersion uint32 `json:"format_version"` + Query string `json:"query"` + CreateSQL string `json:"create_sql"` + Database string `json:"database"` + Sources []MVSource `json:"sources"` + IntervalSeconds int64 `json:"interval_seconds"` + SQLMode string `json:"sql_mode"` + TimeZone string `json:"time_zone"` + TimeZoneOffset int32 `json:"time_zone_offset_seconds"` + LowerCaseTableNames int64 `json:"lower_case_table_names"` + OwnerUser uint32 `json:"owner_user"` + OwnerRole uint32 `json:"owner_role"` + OwnerName string `json:"owner_name"` +} + +func MaterializedViewDefinition(def *plan.TableDef) (*MVDefinition, error) { + if def == nil || def.TableType != SystemMaterializedViewRel { + return nil, nil + } + var value string + for _, p := range def.Props { + if p.Key == MaterializedViewProperty { + value = p.Value + } + } + for _, d := range def.Defs { + if ps := d.GetProperties(); ps != nil { + for _, p := range ps.Properties { + if p.Key == MaterializedViewProperty { + value = p.Value + } + } + } + } + return DecodeMaterializedViewDefinition(value) +} + +func DecodeMaterializedViewDefinition(value string) (*MVDefinition, error) { + var result MVDefinition + if value == "" { + return nil, moerr.NewInternalErrorNoCtx("materialized view definition is missing") + } + // Presence matters: an explicitly empty SQL mode is reproducible, while an + // absent/null field cannot establish format-2 binding semantics. + persisted := struct { + *MVDefinition + SQLMode *string `json:"sql_mode"` + }{MVDefinition: &result} + if err := json.Unmarshal([]byte(value), &persisted); err != nil { + return nil, err + } + if persisted.SQLMode != nil { + result.SQLMode = *persisted.SQLMode + } + if (result.FormatVersion != 1 && result.FormatVersion != MVDefinitionFormatVersion) || result.Query == "" || len(result.Sources) == 0 { + return nil, moerr.NewInternalErrorNoCtx("unsupported materialized view definition") + } + if result.FormatVersion == MVDefinitionFormatVersion { + if persisted.SQLMode == nil { + return nil, moerr.NewInternalErrorNoCtx("materialized view SQL mode is missing") + } + if result.DivPrecisionIncrement == nil || *result.DivPrecisionIncrement < 0 || *result.DivPrecisionIncrement > 30 { + return nil, moerr.NewInternalErrorNoCtx("invalid materialized view division precision") + } + if result.TimeZone == "" || (result.TimeZoneKind != "named" && result.TimeZoneKind != "fixed") || + result.TimeZoneOffset < -24*60*60 || result.TimeZoneOffset > 24*60*60 { + return nil, moerr.NewInternalErrorNoCtx("invalid materialized view timezone") + } + } + return &result, nil +} + +// RefreshTimeZone admits only definitions with reproducible binding semantics. +// Older materializations remain readable but must be recreated before refresh. +func (d *MVDefinition) RefreshTimeZone() (*time.Location, error) { + if d.FormatVersion != MVDefinitionFormatVersion { + return nil, moerr.NewNotSupportedNoCtx("recreate the materialized view before refreshing: legacy definition lacks captured query semantics") + } + if d.TimeZoneKind == "fixed" { + return time.FixedZone(d.TimeZone, int(d.TimeZoneOffset)), nil + } + zone, err := time.LoadLocation(d.TimeZone) + if err != nil || d.TimeZone == "Local" { + return nil, moerr.NewInvalidInputNoCtxf("materialized view timezone %q is unavailable; named timezone rules are required", d.TimeZone) + } + return zone, nil +} + +const MoMaterializedViewsDDL = `create cluster table mo_catalog.mo_materialized_views ( + mv_id bigint unsigned not null, + database_id bigint unsigned not null, + database_name varchar(64) not null, + name varchar(64) not null, + definition text not null, + epoch bigint unsigned not null default 1, + requested_sequence bigint unsigned not null default 0, + successful_sequence bigint unsigned not null default 0, + populated bool not null default false, + last_run varchar(64) not null default '', + source_physical bigint not null default 0, + source_logical int unsigned not null default 0, + last_success timestamp null, + interval_seconds bigint not null default 0, + next_due timestamp null, + next_cleanup timestamp not null default current_timestamp(), + primary key(account_id,mv_id), + unique key mv_name(account_id,database_name,name), + index mv_due(next_due,account_id,mv_id), + index mv_cleanup(next_cleanup,account_id,mv_id) +)` +const MoMVDependenciesDDL = `create cluster table mo_catalog.mo_mv_dependencies ( + mv_id bigint unsigned not null, + source_database_id bigint unsigned not null, + source_table_id bigint unsigned not null, + source_logical_id bigint unsigned not null, + source_version int unsigned not null, + primary key(account_id,mv_id,source_table_id), + index mv_source(account_id,source_table_id) +)` +const MoMVRefreshRunsDDL = `create cluster table mo_catalog.mo_mv_refresh_runs ( + mv_id bigint unsigned not null, + run_id varchar(64) not null, + sequence bigint unsigned not null, + epoch bigint unsigned not null, + status varchar(16) not null, + started_at timestamp not null, + finished_at timestamp null, + source_physical bigint not null default 0, + source_logical int unsigned not null default 0, + error_message varchar(1024) not null default '', + primary key(account_id,mv_id,run_id), + index mv_history(account_id,mv_id,started_at), + index mv_expired(status,started_at) +)` +const MoMVAccountStateDDL = `create cluster table mo_catalog.mo_mv_account_state ( + revision bigint unsigned not null default 0, + primary key(account_id) +)` + +var MaterializedViewCatalogDDLs = []string{MoMaterializedViewsDDL, MoMVDependenciesDDL, MoMVRefreshRunsDDL, MoMVAccountStateDDL} diff --git a/pkg/catalog/materialized_view_test.go b/pkg/catalog/materialized_view_test.go new file mode 100644 index 0000000000000..e5526e17a5cc1 --- /dev/null +++ b/pkg/catalog/materialized_view_test.go @@ -0,0 +1,106 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package catalog + +import ( + "encoding/json" + "fmt" + "testing" + "time" + + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewDefinitionPersistence(t *testing.T) { + def := MVDefinition{FormatVersion: 1, Query: "select k,sum(v) from db.t group by k", Sources: []MVSource{{AccountID: 7, DatabaseID: 3, TableID: 8, LogicalID: 9, Version: 2, Database: "db", Table: "t"}}, SQLMode: "NO_UNSIGNED_SUBTRACTION", TimeZone: "Asia/Shanghai", OwnerUser: 10, OwnerRole: 11, OwnerName: "owner"} + data, err := json.Marshal(def) + require.NoError(t, err) + for _, props := range []bool{true, false} { + table := &plan.TableDef{TableType: SystemMaterializedViewRel} + if props { + table.Props = []*plan.PropertyDef{{Key: MaterializedViewProperty, Value: string(data)}} + } else { + table.Defs = []*plan.TableDef_DefType{{Def: &plan.TableDef_DefType_Properties{Properties: &plan.PropertiesDef{Properties: []*plan.Property{{Key: MaterializedViewProperty, Value: string(data)}}}}}} + } + decoded, err := MaterializedViewDefinition(table) + require.NoError(t, err) + require.Equal(t, def, *decoded) + } + for _, raw := range []string{"", "invalid", `{"format_version":2,"query":"select * from t","sources":[{}]}`, `{"format_version":1,"query":"select 1"}`} { + _, err := MaterializedViewDefinition(&plan.TableDef{TableType: SystemMaterializedViewRel, Props: []*plan.PropertyDef{{Key: MaterializedViewProperty, Value: raw}}}) + require.Error(t, err) + if raw != "invalid" { + require.True(t, moerr.IsMoErrCode(err, moerr.ErrInternal), "stored definition failures must use the engine error contract") + } + } + decoded, err := MaterializedViewDefinition(&plan.TableDef{TableType: SystemOrdinaryRel}) + require.NoError(t, err) + require.Nil(t, decoded) +} + +func TestMaterializedViewSemanticContext(t *testing.T) { + for _, precision := range []int32{0, 4, 10, 30} { + for _, property := range []bool{false, true} { + t.Run(fmt.Sprintf("precision%d/property%t", precision, property), func(t *testing.T) { + def := MVDefinition{FormatVersion: MVDefinitionFormatVersion, Query: "select v/3 from t", Sources: []MVSource{{Table: "t"}}, DivPrecisionIncrement: new(precision), TimeZoneKind: "fixed", TimeZone: "UTC"} + raw, err := json.Marshal(def) + require.NoError(t, err) + table := &plan.TableDef{TableType: SystemMaterializedViewRel} + props := []*plan.PropertyDef{{Key: MaterializedViewProperty, Value: string(raw)}} + if property { + table.Props = props + } else { + table.Defs = []*plan.TableDef_DefType{{Def: &plan.TableDef_DefType_Properties{Properties: &plan.PropertiesDef{Properties: []*plan.Property{{Key: MaterializedViewProperty, Value: string(raw)}}}}}} + } + got, err := MaterializedViewDefinition(table) + require.NoError(t, err) + require.Equal(t, def, *got) + _, err = got.RefreshTimeZone() + require.NoError(t, err) + }) + } + } + for _, value := range []any{nil, int32(-1), int32(31), "4"} { + raw, err := json.Marshal(map[string]any{"format_version": 2, "query": "select v/3 from t", "sources": []MVSource{{Table: "t"}}, "time_zone_kind": "fixed", "time_zone": "UTC", "sql_mode": "", "div_precision_increment": value}) + require.NoError(t, err) + _, err = DecodeMaterializedViewDefinition(string(raw)) + require.Error(t, err) + } + for _, suffix := range []string{"", `,"sql_mode":null`} { + _, err := DecodeMaterializedViewDefinition(`{"format_version":2,"query":"select v/3 from t","sources":[{}],"div_precision_increment":4,"time_zone_kind":"fixed","time_zone":"UTC"` + suffix + `}`) + require.ErrorContains(t, err, "SQL mode is missing") + } + legacy, err := DecodeMaterializedViewDefinition(`{"format_version":1,"query":"select v/3 from t","sources":[{}]}`) + require.NoError(t, err) + _, err = legacy.RefreshTimeZone() + require.ErrorContains(t, err, "recreate") + named := MVDefinition{FormatVersion: MVDefinitionFormatVersion, TimeZoneKind: "named", TimeZone: "America/New_York", TimeZoneOffset: 1234} + zone, err := named.RefreshTimeZone() + require.NoError(t, err) + for _, tc := range []struct { + month time.Month + offset int + }{{time.January, -18000}, {time.July, -14400}} { + _, offset := time.Date(2024, tc.month, 15, 12, 0, 0, 0, time.UTC).In(zone).Zone() + require.Equal(t, tc.offset, offset, "named rules, not persisted observation offset") + } + for _, name := range []string{"Local", "unavailable/MV-zone"} { + named.TimeZone = name + _, err = named.RefreshTimeZone() + require.Error(t, err, "never silently replace rules with a fixed offset") + } +} diff --git a/pkg/cnservice/server.go b/pkg/cnservice/server.go index 62939823bbf16..75ff2c19c4368 100644 --- a/pkg/cnservice/server.go +++ b/pkg/cnservice/server.go @@ -52,6 +52,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/lockservice" "github.com/matrixorigin/matrixone/pkg/logservice" "github.com/matrixorigin/matrixone/pkg/logutil" + "github.com/matrixorigin/matrixone/pkg/mv" "github.com/matrixorigin/matrixone/pkg/objectio/ioutil" "github.com/matrixorigin/matrixone/pkg/partitionservice" "github.com/matrixorigin/matrixone/pkg/pb/metadata" @@ -1325,6 +1326,7 @@ func (s *service) initInternalSQlExecutor(mp *mpool.MPool) { s.rt.SetGlobalVariables(runtime.InternalSQLExecutor, s.sqlExecutor) cdc.InitTableDetector(s.rt, s.sqlExecutor) cdc.InitCDCWatermarkUpdater(s.rt, frontend.NewInternalExecutor(s.cfg.UUID)) + s.rt.SetGlobalVariables(mv.RuntimeKey, mv.NewService(s.sqlExecutor)) s.initMongoDBRuntime() } diff --git a/pkg/cnservice/server_task.go b/pkg/cnservice/server_task.go index deae90d6d67d3..ddc4a99deb93f 100644 --- a/pkg/cnservice/server_task.go +++ b/pkg/cnservice/server_task.go @@ -29,6 +29,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/frontend/databranchutils" "github.com/matrixorigin/matrixone/pkg/iscp" "github.com/matrixorigin/matrixone/pkg/logutil" + "github.com/matrixorigin/matrixone/pkg/mv" logservicepb "github.com/matrixorigin/matrixone/pkg/pb/logservice" "github.com/matrixorigin/matrixone/pkg/pb/task" "github.com/matrixorigin/matrixone/pkg/proxy" @@ -399,6 +400,18 @@ func (s *service) registerExecutorsLocked() { task.TaskCode_DataBranchLineageGC, compile.DataBranchLineageGCExecutor(s.sqlExecutor), ) + if service, ok := runtime.ServiceRuntime(s.cfg.UUID).GetGlobalVariables(mv.RuntimeKey); ok { + s.task.runner.RegisterExecutor(task.TaskCode_MaterializedView, service.(*mv.Service).TaskExecutor(ts, ieFactory)) + if err := s.stopper.RunNamedTask("register materialized view cron", func(ctx context.Context) { + ticker := time.NewTicker(10 * time.Second) + defer ticker.Stop() + s.registerCronTask(ctx, mv.CronMetadata(), func(ctx context.Context) error { + return service.(*mv.Service).RegisterCron(ctx, ts) + }, ticker.C) + }); err != nil { + s.logger.Error("failed to start materialized view cron registration", zap.Error(err)) + } + } // Register outside task.Lock and the heartbeat/startup command paths. The // stopper owns both retries and cancellation before task storage is closed. if err := s.stopper.RunNamedTask("register lineage GC cron", func(ctx context.Context) { @@ -413,18 +426,25 @@ func (s *service) registerExecutorsLocked() { } func (s *service) registerLineageGCCron(ctx context.Context, ts taskservice.TaskService, retry <-chan time.Time) { + metadata := databranchutils.LineageGCTaskMetadata() + s.registerCronTask(ctx, metadata, func(ctx context.Context) error { + return ts.CreateCronTask(ctx, metadata, databranchutils.LineageGCTaskCronExpr) + }, retry) +} + +func (s *service) registerCronTask(ctx context.Context, metadata task.TaskMetadata, create func(context.Context) error, retry <-chan time.Time) { for { if ctx.Err() != nil || !s.task.runnerReady.Load() || s.viewMetadataGenerationRevoked.Load() { return } attempt, cancel := context.WithTimeout(ctx, 30*time.Second) attempt = defines.AttachAccount(attempt, catalog.System_Account, catalog.System_User, catalog.System_Role) - err := ts.CreateCronTask(attempt, databranchutils.LineageGCTaskMetadata(), databranchutils.LineageGCTaskCronExpr) + err := create(attempt) cancel() if err == nil || ctx.Err() != nil { return } - s.logger.Warn("failed to register lineage GC cron; retrying", zap.Error(err)) + s.logger.Warn("failed to register cron task; retrying", zap.String("task", metadata.ID), zap.Error(err)) select { case <-ctx.Done(): return diff --git a/pkg/cnservice/server_task_test.go b/pkg/cnservice/server_task_test.go index 6225c29da14b4..d370abf3448bc 100644 --- a/pkg/cnservice/server_task_test.go +++ b/pkg/cnservice/server_task_test.go @@ -30,6 +30,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/common/stopper" "github.com/matrixorigin/matrixone/pkg/defines" "github.com/matrixorigin/matrixone/pkg/logservice" + "github.com/matrixorigin/matrixone/pkg/mv" pb "github.com/matrixorigin/matrixone/pkg/pb/logservice" "github.com/matrixorigin/matrixone/pkg/pb/task" "github.com/matrixorigin/matrixone/pkg/taskservice" @@ -497,3 +498,68 @@ func Test_registerExecutorsLocked(t *testing.T) { assert.Equal(t, "data_branch_lineage_gc", ts.cronTasks[0].ID) assert.Equal(t, "0 */5 * * * *", ts.cronExprs[0]) } + +func TestMaterializedViewCronRegistrationOwnsRetry(t *testing.T) { + metadata := mv.CronMetadata() + attempts := make(chan struct{}, 1) + calls := 0 + ts := &controlledCronTaskService{testTS: &testTS{}} + ts.create = func(ctx context.Context, got task.TaskMetadata, expression string) error { + account, err := defines.GetAccountId(ctx) + require.NoError(t, err) + require.Equal(t, catalog.System_Account, account) + require.Equal(t, metadata, got) + require.Equal(t, mv.CronExpression, expression) + calls++ + if calls == 1 { + attempts <- struct{}{} + return errors.New("temporary MV task-store failure") + } + return nil + } + s := &service{logger: zap.NewNop()} + s.task.runnerReady.Store(true) + ctx, cancel := context.WithCancel(t.Context()) + defer cancel() + ticks := make(chan time.Time) + done := make(chan struct{}) + admissions := 0 + go func() { + defer close(done) + s.registerCronTask(ctx, metadata, func(ctx context.Context) error { + admissions++ + if admissions == 1 { + attempts <- struct{}{} + return errors.New("MV catalogs are not ready") + } + return ts.CreateCronTask(ctx, metadata, mv.CronExpression) + }, ticks) + }() + select { + case <-attempts: + case <-time.After(2 * time.Second): + t.Fatal("MV registration did not attempt") + } + select { + case ticks <- time.Now(): + case <-time.After(2 * time.Second): + t.Fatal("MV registration did not enter its own retry wait") + } + select { + case <-attempts: + case <-time.After(2 * time.Second): + t.Fatal("MV readiness retry did not reach task storage") + } + select { + case ticks <- time.Now(): + case <-time.After(2 * time.Second): + t.Fatal("MV task-store failure did not enter the same retry wait") + } + select { + case <-done: + case <-time.After(2 * time.Second): + t.Fatal("MV retry did not complete") + } + require.Equal(t, 2, calls) + require.Equal(t, 3, admissions) +} diff --git a/pkg/defines/const.go b/pkg/defines/const.go index be6d1ea7e2e71..e8ec585075073 100644 --- a/pkg/defines/const.go +++ b/pkg/defines/const.go @@ -154,7 +154,8 @@ const ( MORPCVersion116 int64 = 116 // SELECT scalar division warning diagnostics MORPCVersion117 int64 = 117 // versioned collation-aware LEAST/GREATEST ordering MORPCVersion118 int64 = 118 // transactional database defaults and table charset alteration - MORPCLatestVersion = MORPCVersion118 + MORPCVersion119 int64 = 119 // native read-only materialized views and atomic refresh + MORPCLatestVersion = MORPCVersion119 ) // DefaultLockWaitTimeoutSeconds is shared by the frontend default and by diff --git a/pkg/defines/materialized_view.go b/pkg/defines/materialized_view.go new file mode 100644 index 0000000000000..d3e070a18ad19 --- /dev/null +++ b/pkg/defines/materialized_view.go @@ -0,0 +1,93 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package defines + +import ( + "context" + "sync/atomic" + + "github.com/matrixorigin/matrixone/pkg/common/moerr" +) + +type materializedViewWriteKey struct{} +type materializedViewWrite struct { + account uint32 + table uint64 + txn string +} + +// WithMaterializedViewWrite is an internal, transaction-bound capability. There +// is deliberately no SQL/session variable that can construct this context value. +func WithMaterializedViewWrite(ctx context.Context, account uint32, table uint64, txnID []byte) context.Context { + return context.WithValue(ctx, materializedViewWriteKey{}, materializedViewWrite{account, table, string(txnID)}) +} + +func CanWriteMaterializedView(ctx context.Context, account uint32, table uint64, txnID []byte) bool { + v, ok := ctx.Value(materializedViewWriteKey{}).(materializedViewWrite) + return ok && table != 0 && len(txnID) != 0 && v.account == account && v.table == table && v.txn == string(txnID) +} + +// HasMaterializedViewWrite permits definition-time DML binding. Execution must +// additionally verify the transaction identity through CanWriteMaterializedView. +func HasMaterializedViewWrite(ctx context.Context, account uint32, table uint64) bool { + v, ok := ctx.Value(materializedViewWriteKey{}).(materializedViewWrite) + return ok && v.account == account && v.table == table && table != 0 +} + +// MaterializedViewTask is supplied only by the typed background task executor. +// Object identity and epoch prevent stale tasks from resolving a recreated name. +type MaterializedViewTask struct { + Account uint32 + Table, Epoch uint64 + RunID string +} +type materializedViewTaskKey struct{} + +func WithMaterializedViewTask(ctx context.Context, task MaterializedViewTask) context.Context { + return context.WithValue(ctx, materializedViewTaskKey{}, task) +} +func GetMaterializedViewTask(ctx context.Context) (MaterializedViewTask, bool) { + task, ok := ctx.Value(materializedViewTaskKey{}).(MaterializedViewTask) + return task, ok +} + +func MaterializedViewWriteActive(ctx context.Context) bool { + v, ok := ctx.Value(materializedViewWriteKey{}).(materializedViewWrite) + return ok && v.table != 0 && v.txn != "" +} + +type materializedViewBudgetKey struct{} +type materializedViewBudget struct { + table uint64 + used atomic.Int64 + limit int64 +} + +func WithMaterializedViewBudget(ctx context.Context, table uint64, limit int64) context.Context { + return context.WithValue(ctx, materializedViewBudgetKey{}, &materializedViewBudget{table: table, limit: limit}) +} + +// ChargeMaterializedViewOutput shares a counter across local parallel writers. +// Ordinary writers have no counter, and DROP/DELETE never charge inserted bytes. +func ChargeMaterializedViewOutput(ctx context.Context, table uint64, bytes int) error { + budget, ok := ctx.Value(materializedViewBudgetKey{}).(*materializedViewBudget) + if !ok || budget.table != table { + return nil + } + if bytes < 0 || budget.used.Add(int64(bytes)) > budget.limit { + return moerr.NewInvalidInput(ctx, "materialized view output budget exceeded") + } + return nil +} diff --git a/pkg/defines/materialized_view_test.go b/pkg/defines/materialized_view_test.go new file mode 100644 index 0000000000000..845b5d533d513 --- /dev/null +++ b/pkg/defines/materialized_view_test.go @@ -0,0 +1,51 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package defines + +import ( + "context" + "sync" + "sync/atomic" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewCapability(t *testing.T) { + ctx := WithMaterializedViewWrite(context.Background(), 7, 99, []byte("transaction")) + require.True(t, CanWriteMaterializedView(ctx, 7, 99, []byte("transaction"))) + require.False(t, CanWriteMaterializedView(ctx, 8, 99, []byte("transaction"))) + require.False(t, CanWriteMaterializedView(ctx, 7, 100, []byte("transaction"))) + require.False(t, CanWriteMaterializedView(ctx, 7, 99, []byte("different"))) + require.False(t, CanWriteMaterializedView(ctx, 7, 99, nil)) + require.False(t, MaterializedViewWriteActive(context.Background())) +} +func TestMaterializedViewOutputBudget(t *testing.T) { + ctx := WithMaterializedViewBudget(context.Background(), 99, 100) + require.NoError(t, ChargeMaterializedViewOutput(ctx, 100, 1000)) + var accepted atomic.Int64 + var wg sync.WaitGroup + for i := 0; i < 20; i++ { + wg.Go(func() { + if ChargeMaterializedViewOutput(ctx, 99, 10) == nil { + accepted.Add(1) + } + }) + } + wg.Wait() + require.Equal(t, int64(10), accepted.Load()) + require.Error(t, ChargeMaterializedViewOutput(ctx, 99, 1)) + require.NoError(t, ChargeMaterializedViewOutput(context.Background(), 99, 1000)) +} diff --git a/pkg/frontend/authenticate.go b/pkg/frontend/authenticate.go index b0634ab1c5c5c..ed802ac1771a0 100644 --- a/pkg/frontend/authenticate.go +++ b/pkg/frontend/authenticate.go @@ -961,12 +961,16 @@ var ( catalog.MO_FEATURE_REGISTRY: 0, } sysAccountTables = map[string]struct{}{ - catalog.MOVersionTable: {}, - catalog.MOUpgradeTable: {}, - catalog.MOUpgradeTenantTable: {}, - catalog.MO_PITR: {}, - catalog.MOPartitionMetadata: {}, - catalog.MOPartitionTables: {}, + catalog.MO_MATERIALIZED_VIEWS: {}, + catalog.MO_MV_DEPENDENCIES: {}, + catalog.MO_MV_REFRESH_RUNS: {}, + catalog.MO_MV_ACCOUNT_STATE: {}, + catalog.MOVersionTable: {}, + catalog.MOUpgradeTable: {}, + catalog.MOUpgradeTenantTable: {}, + catalog.MO_PITR: {}, + catalog.MOPartitionMetadata: {}, + catalog.MOPartitionTables: {}, } // predefined tables of the database mo_catalog in every account predefinedTables = map[string]int8{ @@ -1049,6 +1053,10 @@ var ( MoCatalogMoSubsDDL, MoCatalogMoViewDependenciesDDL, MoCatalogMoViewRefreshDDL, + catalog.MoMaterializedViewsDDL, + catalog.MoMVDependenciesDDL, + catalog.MoMVRefreshRunsDDL, + catalog.MoMVAccountStateDDL, MoCatalogMoStoredProcedureDDL, MoCatalogMoStagesDDL, MoCatalogMoSessionsDDL, @@ -4232,6 +4240,12 @@ func doDropAccount(ctx context.Context, bh BackgroundExec, ses *Session, da *dro } } + // Retire native MVs in this transaction before tenant database guards + // inspect their definitions. Ordinary DROP DATABASE stays RESTRICT. + if rtnErr = retireAccountMaterializedViews(ctx, bh, uint32(accountId)); rtnErr != nil { + return rtnErr + } + // drop tables of the tenant // NOTE!!!: single DDL drop statement per single transaction // SWITCH TO THE CONTEXT of the deleted context @@ -6585,6 +6599,17 @@ func determinePrivilegeSetOfStatement(stmt tree.Statement) *privilege { clusterTableOperation = clusterTableCreate } dbName = string(st.Table.SchemaName) + case *tree.CreateMaterializedView: + objType = objectTypeDatabase + typs = append(typs, PrivilegeTypeCreateView, PrivilegeTypeDatabaseAll, PrivilegeTypeDatabaseOwnership) + writeDatabaseAndTableDirectly = true + appendWriteTableNameDatabaseName(st.Name) + if st.Name != nil { + dbName = string(st.Name.SchemaName) + } + case *tree.RefreshMaterializedView, *tree.DropMaterializedView, *tree.AlterMaterializedView, *tree.ShowMaterializedViews: + objType = objectTypeNone + kind = privilegeKindNone case *tree.CreateView: objType = objectTypeDatabase typs = append(typs, PrivilegeTypeCreateView, PrivilegeTypeDatabaseAll, PrivilegeTypeDatabaseOwnership) @@ -7211,6 +7236,15 @@ func extractPrivilegeTipsFromPlan(p *plan2.Plan) (privilegeTipsArray, error) { for nodeID, node := range q.Nodes { if isPrivilegeBearingTableScan(node) || isMongoDBExternalTableScan(node) { + definition, err := catalog.MaterializedViewDefinition(node.TableDef) + if err != nil { + return nil, err + } + if definition != nil { + for _, source := range definition.Sources { + appendPt(privilegeTips{typ: PrivilegeTypeSelect, objType: objectTypeTable, databaseName: source.Database, tableName: source.Table, clusterTableOperation: clusterTableSelect}) + } + } if _, ok := insertDedupScans[int32(nodeID)]; ok { continue } @@ -9267,6 +9301,9 @@ func authenticateUserCanExecuteStatementWithObjectTypeDatabaseAndTable(ctx conte var stats statistic.StatsArray stats.Reset() + if st, ok := stmt.(*tree.CreateMaterializedView); ok { + return authenticateCreateTableAsSelectSourcePrivilege(ctx, ses, &tree.CreateTable{AsSource: st.AsSource}) + } if st, ok := stmt.(*tree.CreateTable); ok && st.IsAsSelect { if !checkProtectedDatabaseWrite(ctx, ses, string(st.Table.SchemaName)) { return false, stats, nil @@ -10908,6 +10945,10 @@ func createTablesInMoCatalogOfGeneralTenant2(bh BackgroundExec, ca *createAccoun strings.HasPrefix(sql, "create cluster table mo_catalog.mo_view_refresh") { return true } + if isMaterializedViewCatalogDDL(sql) { + return true + } + if strings.HasPrefix(sql, "create table mo_catalog.mo_cdc_task") { return true } @@ -12522,6 +12563,12 @@ func doGrantPrivilegeImplicitly(ctx context.Context, ses *Session, stmt tree.Sta switch st := stmt.(type) { case *tree.CreateDatabase: sql = getSqlForGrantOwnershipOnDatabase(string(st.Name), curRole) + case *tree.CreateMaterializedView: + dbName := string(st.Name.SchemaName) + if dbName == "" { + dbName = ses.GetDatabaseName() + } + sql = getSqlForGrantOwnershipOnTable(dbName, string(st.Name.ObjectName), curRole) case *tree.CreateTable: // get database name var dbName string diff --git a/pkg/frontend/authenticate_test.go b/pkg/frontend/authenticate_test.go index e5e5ba34918d8..207f3eb3b51a1 100644 --- a/pkg/frontend/authenticate_test.go +++ b/pkg/frontend/authenticate_test.go @@ -49,6 +49,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/fileservice" "github.com/matrixorigin/matrixone/pkg/frontend/databranchutils" mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" + "github.com/matrixorigin/matrixone/pkg/mv" "github.com/matrixorigin/matrixone/pkg/pb/metadata" "github.com/matrixorigin/matrixone/pkg/pb/plan" "github.com/matrixorigin/matrixone/pkg/pb/timestamp" @@ -12181,6 +12182,7 @@ func Test_doDropAccount(t *testing.T) { bh := &backgroundExecTest{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) bhStub := gostub.StubFunc(&NewBackgroundExec, bh) defer bhStub.Reset() @@ -12247,6 +12249,7 @@ func Test_doDropAccount(t *testing.T) { bh := &backgroundExecTest{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) bhStub := gostub.StubFunc(&NewBackgroundExec, bh) defer bhStub.Reset() @@ -12296,6 +12299,7 @@ func Test_doDropAccount(t *testing.T) { bh := &backgroundExecTest{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) bhStub := gostub.StubFunc(&NewBackgroundExec, bh) defer bhStub.Reset() @@ -12361,6 +12365,7 @@ func TestDoDropAccountSQLTaskCleanupFailureRollsBack(t *testing.T) { bh := &backgroundExecTest{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) bh.sql2result["begin;"] = nil bh.sql2result["rollback;"] = nil @@ -12411,6 +12416,7 @@ func Test_doDropAccount_InTransaction(t *testing.T) { bh := &backgroundExecTestWithHistory{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) stmt := &tree.DropAccount{ Name: boxExprStr("test_acc"), @@ -12487,6 +12493,7 @@ func Test_doDropAccount_InTransaction(t *testing.T) { bh := &backgroundExecTestWithHistory{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) stmt := &tree.DropAccount{ Name: boxExprStr("test_acc"), @@ -12560,6 +12567,7 @@ func Test_doDropAccount_InTransaction(t *testing.T) { bh := &backgroundExecTestWithHistory{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) gateSQL := databranchutils.LineageOwnerLifecycleLockSQL() wantErr := errors.New("lifecycle gate failed") bh.sql2result["begin;"] = nil @@ -12588,6 +12596,7 @@ func Test_doDropAccount_AccountOwnedMetadataCleanupError(t *testing.T) { bh := &backgroundExecTestWithHistory{} bh.init() + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) stmt := &tree.DropAccount{Name: boxExprStr("acc")} priv := determinePrivilegeSetOfStatement(stmt) diff --git a/pkg/frontend/internal_executor.go b/pkg/frontend/internal_executor.go index b84f447625e5a..f88aeb2892ff3 100644 --- a/pkg/frontend/internal_executor.go +++ b/pkg/frontend/internal_executor.go @@ -50,6 +50,7 @@ func applyOverride(sess *Session, opts ie.SessionOverrideOptions) { if acc != nil { if opts.AccountId != nil { acc.SetTenantID(*opts.AccountId) + sess.SetAccountId(*opts.AccountId) } if opts.UserId != nil { @@ -229,6 +230,7 @@ func (ie *internalExecutor) newCmdSession(ctx context.Context, opts ie.SessionOv t, _ = GetTenantInfo(ctx, DefaultTenantMoAdmin) } sess.SetTenantInfo(t) + sess.SetAccountId(t.GetTenantID()) applyOverride(sess, ie.baseSessOpts) applyOverride(sess, opts) diff --git a/pkg/frontend/internal_executor_test.go b/pkg/frontend/internal_executor_test.go index c65ea2022e5a7..b4cb1610ee49d 100644 --- a/pkg/frontend/internal_executor_test.go +++ b/pkg/frontend/internal_executor_test.go @@ -207,3 +207,38 @@ func Test_WriteResultSetRow2(t *testing.T) { err := ip.WriteResultSetRow2(nil, nil, 1) assert.NoError(t, err) } + +func TestInternalExecutorSessionAccountIdentity(t *testing.T) { + runtime.RunTest("", func(rt runtime.Runtime) { + pu := config.NewParameterUnit(&config.FrontendParameters{}, nil, nil, nil) + setPu("", pu) + for _, tc := range []struct { + name string + contextAccount, baseAccount, commandAccount, want uint32 + setBase, setCommand bool + }{ + {"context", 7, 0, 0, 7, false, false}, + {"base override", 7, 8, 0, 8, true, false}, + {"command override", 7, 8, 9, 9, true, true}, + {"system override", 7, 8, 0, 0, true, true}, + } { + t.Run(tc.name, func(t *testing.T) { + ctx := defines.AttachAccount(context.Background(), tc.contextAccount, 11, 12) + internal := newIe("") + if tc.setBase { + internal.ApplySessionOverride(ie.NewOptsBuilder().AccountId(tc.baseAccount).Finish()) + } + opts := ie.NewOptsBuilder().UserId(11).DefaultRoleId(12).Internal(false) + if tc.setCommand { + opts.AccountId(tc.commandAccount) + } + sess := internal.newCmdSession(ctx, opts.Finish()) + defer sess.Close() + assert.Equal(t, tc.want, sess.GetAccountId()) + assert.Equal(t, tc.want, sess.GetTenantInfo().GetTenantID()) + assert.Equal(t, uint32(11), sess.GetTenantInfo().GetUserID()) + assert.Equal(t, uint32(12), sess.GetTenantInfo().GetDefaultRoleID()) + }) + } + }) +} diff --git a/pkg/frontend/materialized_view.go b/pkg/frontend/materialized_view.go new file mode 100644 index 0000000000000..561166b4c3e3b --- /dev/null +++ b/pkg/frontend/materialized_view.go @@ -0,0 +1,448 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package frontend + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + "strings" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + moruntime "github.com/matrixorigin/matrixone/pkg/common/runtime" + "github.com/matrixorigin/matrixone/pkg/common/sqlquote" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/mv" + "github.com/matrixorigin/matrixone/pkg/pb/txn" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + plan2 "github.com/matrixorigin/matrixone/pkg/sql/plan" + "github.com/matrixorigin/matrixone/pkg/util/executor" +) + +func materializedViewService(ctx context.Context, ses *Session) (*mv.Service, error) { + v, ok := moruntime.ServiceRuntime(ses.GetService()).GetGlobalVariables(mv.RuntimeKey) + if !ok { + return nil, moerr.NewInternalError(ctx, "materialized view service is unavailable") + } + return v.(*mv.Service), nil +} +func resolveMaterializedView(ctx context.Context, ses *Session, name *tree.TableName) (mv.Key, *catalog.MVDefinition, error) { + db := string(name.SchemaName) + if db == "" { + db = ses.GetDatabaseName() + } + _, def, err := ses.GetTxnCompileCtx().Resolve(db, string(name.ObjectName), nil) + if err != nil { + return mv.Key{}, nil, err + } + if def == nil { + return mv.Key{}, nil, moerr.NewNoSuchTable(ctx, db, string(name.ObjectName)) + } + d, err := catalog.MaterializedViewDefinition(def) + if err != nil { + return mv.Key{}, nil, err + } + if d == nil { + return mv.Key{}, nil, moerr.NewInvalidInput(ctx, "object is not a materialized view") + } + return mv.Key{Account: ses.GetAccountId(), ID: def.TblId}, d, nil +} +func authorizeMaterializedViewOwner(ctx context.Context, ses *Session, def *catalog.MVDefinition) error { + tenant := ses.GetTenantInfo() + if tenant == nil || (!tenant.IsAdminRole() && tenant.GetUserID() != def.OwnerUser) { + return moerr.NewInvalidInput(ctx, "materialized view operation requires owner or administrative authority") + } + return nil +} +func checkMaterializedViewTransaction(ctx context.Context, ses *Session) error { + if ses.GetTxnHandler().InMultiStmtTransactionMode() { + return moerr.NewInvalidInput(ctx, "materialized view DDL/refresh cannot execute in an active user transaction") + } + return plan2.RequirePersistedProtocolVersionForAuthoring(ctx, ses.GetTxnCompileCtx().GetProcess(), defines.MORPCVersion119) +} +func handleRefreshMaterializedView(ctx context.Context, ses *Session, stmt *tree.RefreshMaterializedView) error { + if err := checkMaterializedViewTransaction(ctx, ses); err != nil { + return err + } + key, def, err := resolveMaterializedView(ctx, ses, stmt.Name) + if err != nil { + return err + } + if err := authorizeMaterializedViewOwner(ctx, ses, def); err != nil { + return err + } + if _, background := defines.GetMaterializedViewTask(ctx); background { + svc, err := materializedViewService(ctx, ses) + if err != nil { + return err + } + if err = validateMaterializedViewDefiner(ctx, ses, svc, def); err != nil { + return err + } + } + // CREATE captured every source before optimization. Authorize those native + // sources directly so the caller's current SQL mode cannot rebind a stored + // expression while checking permissions. Refresh separately fences IDs and + // schema versions in its source transaction. + priv := determinePrivilegeSetOfStatement(&tree.Select{}) + var tips privilegeTipsArray + for _, source := range def.Sources { + tips = append(tips, privilegeTips{typ: PrivilegeTypeSelect, objType: objectTypeTable, databaseName: source.Database, tableName: source.Table, clusterTableOperation: clusterTableSelect}) + } + convertPrivilegeTipsToPrivilege(priv, tips) + allowed, _, err := determineUserHasPrivilegeSet(ctx, ses, priv) + if err != nil { + return err + } + if !allowed { + return moerr.NewInvalidInput(ctx, "materialized view source SELECT privilege is required") + } + svc, err := materializedViewService(ctx, ses) + if err != nil { + return err + } + expectedEpoch := uint64(0) + if background, ok := defines.GetMaterializedViewTask(ctx); ok { + if key.Account != background.Account || key.ID != background.Table { + return moerr.NewInvalidInput(ctx, "obsolete materialized view task object") + } + expectedEpoch = background.Epoch + + } + return svc.Refresh(ctx, key, expectedEpoch) +} +func handleDropMaterializedView(ctx context.Context, ses *Session, stmt *tree.DropMaterializedView) error { + if err := checkMaterializedViewTransaction(ctx, ses); err != nil { + return err + } + key, def, err := resolveMaterializedView(ctx, ses, stmt.Name) + if err != nil { + if stmt.IfExists && moerr.IsMoErrCode(err, moerr.ErrNoSuchTable) { + return nil + } + return err + } + if err := authorizeMaterializedViewOwner(ctx, ses, def); err != nil { + return err + } + svc, err := materializedViewService(ctx, ses) + if err != nil { + return err + } + // Native DROP TABLE participates in the catalog/lineage lifecycle lock + // protocol. Select its required mode on this owning transaction, including + // when the deployment defaults to optimistic transactions. + return svc.SQL.ExecTxn(ctx, func(tx executor.TxnExecutor) error { + if err := mv.DependencyGuard(tx, key.Account); err != nil { + return err + } + st, err := mv.Load(tx, key) + if err != nil { + return err + } + writeCtx := defines.WithMaterializedViewWrite(ctx, key.Account, key.ID, tx.Txn().Txn().ID) + r, err := svc.SQL.Exec(writeCtx, "drop table "+mv.Quote(st.Database)+"."+mv.Quote(st.Name), executor.Options{}.WithAccountID(key.Account).WithTxn(tx.Txn())) + if err != nil { + return err + } + r.Close() + r, err = tx.Exec(fmt.Sprintf("delete from mo_catalog.mo_role_privs where obj_type='table' and obj_id=%d", key.ID), executor.StatementOption{}.WithAccountID(key.Account)) + if err != nil { + return err + } + r.Close() + for _, table := range []string{catalog.MO_MV_DEPENDENCIES, catalog.MO_MV_REFRESH_RUNS, catalog.MO_MATERIALIZED_VIEWS} { + r, err := tx.Exec(fmt.Sprintf("delete from mo_catalog.%s where account_id=%d and mv_id=%d", table, key.Account, key.ID), executor.StatementOption{}.WithAccountID(catalog.System_Account)) + if err != nil { + return err + } + r.Close() + } + return nil + }, executor.Options{}.WithAccountID(key.Account). + WithTxnMode(txn.TxnMode_Pessimistic).WithTxnIsolation(txn.TxnIsolation_RC). + WithWaitCommittedLogApplied()) +} +func handleAlterMaterializedView(ctx context.Context, ses *Session, stmt *tree.AlterMaterializedView) error { + if err := checkMaterializedViewTransaction(ctx, ses); err != nil { + return err + } + if stmt.IntervalSeconds != 0 && stmt.IntervalSeconds < 60 { + return moerr.NewInvalidInput(ctx, "materialized view interval must be at least 60 seconds") + } + key, def, err := resolveMaterializedView(ctx, ses, stmt.Name) + if err != nil { + return err + } + if err := authorizeMaterializedViewOwner(ctx, ses, def); err != nil { + return err + } + svc, err := materializedViewService(ctx, ses) + if err != nil { + return err + } + next := "null" + if stmt.IntervalSeconds > 0 { + if _, err := def.RefreshTimeZone(); err != nil { + return err + } + next = fmt.Sprintf("date_add(current_timestamp(),interval %d second)", stmt.IntervalSeconds) + } + def.IntervalSeconds = stmt.IntervalSeconds + definitionJSON, err := json.Marshal(def) + if err != nil { + return err + } + r, err := svc.SQL.Exec(ctx, fmt.Sprintf("update mo_catalog.mo_materialized_views set epoch=epoch+1,definition='%s',interval_seconds=%d,next_due=%s where account_id=%d and mv_id=%d", sqlquote.EscapeString(string(definitionJSON)), stmt.IntervalSeconds, next, key.Account, key.ID), executor.Options{}.WithAccountID(catalog.System_Account).WithWaitCommittedLogApplied()) + if err != nil { + return err + } + r.Close() + return nil +} +func handleShowMaterializedViews(ctx context.Context, ses *Session, stmt *tree.ShowMaterializedViews) error { + svc, err := materializedViewService(ctx, ses) + if err != nil { + return err + } + query := fmt.Sprintf("select name,database_name,epoch,populated,source_physical,source_logical,interval_seconds from mo_catalog.mo_materialized_views where account_id=%d", ses.GetAccountId()) + cols := []string{"name", "database", "definition_epoch", "populated", "source_physical", "source_logical", "interval_seconds"} + if stmt.Name == nil && !ses.GetTenantInfo().IsAdminRole() { + query += fmt.Sprintf(" and cast(json_extract(definition,'$.owner_user') as bigint unsigned)=%d", ses.GetTenantInfo().GetUserID()) + } + if stmt.Name != nil { + key, def, err := resolveMaterializedView(ctx, ses, stmt.Name) + if err != nil { + return err + } + if err := authorizeMaterializedViewOwner(ctx, ses, def); err != nil { + return err + } + if stmt.Create { + m := ses.GetMysqlResultSet() + m.AddColumn(newSQLTaskColumn("Materialized View", defines.MYSQL_TYPE_VARCHAR)) + m.AddColumn(newSQLTaskColumn("Create Materialized View", defines.MYSQL_TYPE_VARCHAR)) + state, err := svc.State(ctx, key) + if err != nil { + return err + } + policy := "manual" + if state.Interval > 0 { + policy = fmt.Sprintf("every interval %d second", state.Interval) + } + m.AddRow([]interface{}{string(stmt.Name.ObjectName), "create materialized view " + mv.Quote(state.Database) + "." + mv.Quote(state.Name) + " refresh " + policy + " as " + def.Query}) + return nil + } + query = fmt.Sprintf("select run_id,status,sequence,epoch,error_message from mo_catalog.mo_mv_refresh_runs where account_id=%d and mv_id=%d order by sequence desc limit 100", key.Account, key.ID) + cols = []string{"run_id", "status", "sequence", "definition_epoch", "error_message"} + } + r, err := svc.SQL.Exec(ctx, query, executor.Options{}.WithAccountID(catalog.System_Account)) + if err != nil { + return err + } + defer r.Close() + m := ses.GetMysqlResultSet() + for _, c := range cols { + m.AddColumn(newSQLTaskColumn(c, defines.MYSQL_TYPE_VARCHAR)) + } + r.ReadRows(func(n int, c []*vector.Vector) bool { + for i := 0; i < n; i++ { + row := make([]interface{}, len(c)) + for j, v := range c { + switch v.GetType().Oid { + case types.T_varchar, types.T_text: + row[j] = v.GetStringAt(i) + case types.T_bool: + row[j] = strconv.FormatBool(vector.GetFixedAtWithTypeCheck[bool](v, i)) + case types.T_uint64: + row[j] = strconv.FormatUint(vector.GetFixedAtWithTypeCheck[uint64](v, i), 10) + case types.T_uint32: + row[j] = strconv.FormatUint(uint64(vector.GetFixedAtWithTypeCheck[uint32](v, i)), 10) + case types.T_int64: + row[j] = strconv.FormatInt(vector.GetFixedAtWithTypeCheck[int64](v, i), 10) + } + } + m.AddRow(row) + } + return true + }) + return nil +} + +// A definer task revalidates IDs and names rather than inheriting the internal +// executor's sys administrator role name. A dropped/recreated user is rejected. +func validateMaterializedViewDefiner(ctx context.Context, ses *Session, svc *mv.Service, def *catalog.MVDefinition) error { + // InternalExecutor bypasses login and has no Routine. Resolve live account + // status from the system-owned lifecycle catalog before reading tenant users + // or admitting any source execution. Missing/unknown states fail closed. + accountResult, err := svc.SQL.Exec(ctx, fmt.Sprintf("select status from mo_catalog.mo_account where account_id=%d", ses.GetAccountId()), executor.Options{}.WithAccountID(catalog.System_Account)) + if err != nil { + return err + } + active := false + accountRows := 0 + accountResult.ReadRows(func(n int, c []*vector.Vector) bool { + accountRows += n + if n == 1 { + active = strings.EqualFold(c[0].GetStringAt(0), tree.AccountStatusOpen.String()) + } + return true + }) + accountResult.Close() + if accountRows != 1 || !active { + return moerr.NewInvalidInput(ctx, "materialized view account is unavailable, suspended or restricted") + } + query := fmt.Sprintf("select u.user_name,u.status,r.role_name from mo_catalog.mo_user u join mo_catalog.mo_user_grant g on u.user_id=g.user_id join mo_catalog.mo_role r on r.role_id=g.role_id where u.user_id=%d and r.role_id=%d", def.OwnerUser, def.OwnerRole) + result, err := svc.SQL.Exec(ctx, query, executor.Options{}.WithAccountID(ses.GetAccountId())) + if err != nil { + return err + } + defer result.Close() + valid := false + roleName := "" + result.ReadRows(func(n int, c []*vector.Vector) bool { + if n == 1 { + valid = c[0].GetStringAt(0) == def.OwnerName && strings.EqualFold(c[1].GetStringAt(0), userStatusUnlock) + roleName = c[2].GetStringAt(0) + } + return false + }) + if !valid { + return moerr.NewInvalidInput(ctx, "materialized view definer is unavailable or its role was revoked") + } + ses.GetTenantInfo().SetDefaultRole(roleName) + ses.GetTenantInfo().SetUser(def.OwnerName) + ses.InvalidatePrivilegeCache() + return nil +} + +func isMaterializedViewCatalogDDL(sql string) bool { + for _, name := range []string{catalog.MO_MATERIALIZED_VIEWS, catalog.MO_MV_DEPENDENCIES, catalog.MO_MV_REFRESH_RUNS, catalog.MO_MV_ACCOUNT_STATE} { + if strings.HasPrefix(sql, "create cluster table mo_catalog."+name+" ") { + return true + } + } + return false +} + +// Retire MV metadata before DROP ACCOUNT enters tenant DROP DATABASE. The +// caller owns the already-open account-drop transaction and account-name lock. +// Account/dependency and definition writes conflict with creation/publication; +// deletion makes queued envelopes obsolete, including late scheduler delivery. +func retireAccountMaterializedViews(ctx context.Context, bh BackgroundExec, account uint32) error { + bh.ClearExecResultSet() + if err := bh.Exec(ctx, mv.CatalogReadinessSQL); err != nil { + return err + } + results, err := getResultSet(ctx, bh) + if err != nil { + return err + } + if len(results) == 0 || results[0].GetRowCount() != 1 { + return moerr.NewInternalError(ctx, "invalid materialized view catalog readiness") + } + count, err := results[0].GetInt64(ctx, 0, 0) + if err != nil { + return err + } + if count == 0 { + return nil + } + if count != 4 { + return moerr.NewInternalError(ctx, "incomplete materialized view catalog migration") + } + statements := accountMaterializedViewRetirementSQL(account) + for _, sql := range statements[:3] { + if err := bh.Exec(ctx, sql); err != nil { + return err + } + } + // DROP DATABASE lowers native objects through DROP TABLE, whose read-only + // guard remains in force. Retire each MV using the existing exact + // account/table/transaction capability, never an account-wide DDL bypass. + bh.ClearExecResultSet() + if err := bh.Exec(ctx, fmt.Sprintf("select mv_id,database_name,name from mo_catalog.mo_materialized_views where account_id=%d order by mv_id limit 129", account)); err != nil { + return err + } + objects, err := getResultSet(ctx, bh) + if err != nil { + return err + } + if len(objects) > 1 { + return moerr.NewInternalError(ctx, "invalid materialized view retirement result") + } + // Background SELECTs without rows may produce no result set at all. + // Such accounts still need the metadata and queued-task cleanup below. + var rows uint64 + if len(objects) == 1 { + rows = objects[0].GetRowCount() + } + if rows > 128 { + return moerr.NewInternalError(ctx, "materialized view account limit exceeded during retirement") + } + for i := uint64(0); i < rows; i++ { + id, err := objects[0].GetUint64(ctx, i, 0) + if err != nil { + return err + } + database, err := objects[0].GetString(ctx, i, 1) + if err != nil { + return err + } + name, err := objects[0].GetString(ctx, i, 2) + if err != nil { + return err + } + owner, ok := bh.(interface{ materializedViewRetirementTxnID() []byte }) + if !ok || len(owner.materializedViewRetirementTxnID()) == 0 { + return moerr.NewInternalError(ctx, "materialized view retirement requires account transaction") + } + writeCtx := defines.WithMaterializedViewWrite(defines.AttachAccountId(ctx, account), account, id, owner.materializedViewRetirementTxnID()) + if err := bh.Exec(writeCtx, "drop table "+mv.Quote(database)+"."+mv.Quote(name)); err != nil { + return err + } + } + for _, sql := range statements[3:] { + if err := bh.Exec(ctx, sql); err != nil { + return err + } + } + return nil +} + +func (back *backExec) materializedViewRetirementTxnID() []byte { + op := backgroundExecTxnOperator(back) + if op == nil { + return nil + } + return op.Txn().ID +} + +func accountMaterializedViewRetirementSQL(account uint32) []string { + return []string{ + fmt.Sprintf("insert ignore into mo_catalog.mo_mv_account_state (account_id,revision) values (%d,0)", account), + fmt.Sprintf("update mo_catalog.mo_mv_account_state set revision=revision+1 where account_id=%d", account), + fmt.Sprintf("update mo_catalog.mo_materialized_views set epoch=epoch+1,interval_seconds=0,next_due=null where account_id=%d", account), + fmt.Sprintf("delete from mo_task.sys_async_task where task_metadata_executor=17 and json_extract(cast(task_metadata_context as varchar),'$.Key.Account')=%d", account), + fmt.Sprintf("delete from mo_catalog.mo_mv_dependencies where account_id=%d", account), + fmt.Sprintf("delete from mo_catalog.mo_mv_refresh_runs where account_id=%d", account), + fmt.Sprintf("delete from mo_catalog.mo_materialized_views where account_id=%d", account), + fmt.Sprintf("delete from mo_catalog.mo_mv_account_state where account_id=%d", account), + } +} diff --git a/pkg/frontend/materialized_view_test.go b/pkg/frontend/materialized_view_test.go new file mode 100644 index 0000000000000..9ec905a11cdfe --- /dev/null +++ b/pkg/frontend/materialized_view_test.go @@ -0,0 +1,192 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package frontend + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/golang/mock/gomock" + "github.com/matrixorigin/matrixone/pkg/common/mpool" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/defines" + mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" + "github.com/matrixorigin/matrixone/pkg/mv" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "strings" + "testing" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewReadPrivileges(t *testing.T) { + def := catalog.MVDefinition{FormatVersion: 1, Query: "select * from src", Sources: []catalog.MVSource{{Database: "db", Table: "src"}, {Database: "db", Table: "dimension"}}} + data, err := json.Marshal(def) + require.NoError(t, err) + p := &plan.Plan{Plan: &plan.Plan_Query{Query: &plan.Query{StmtType: plan.Query_SELECT, Nodes: []*plan.Node{{NodeType: plan.Node_TABLE_SCAN, ObjRef: &plan.ObjectRef{SchemaName: "db", ObjName: "stored"}, TableDef: &plan.TableDef{TableType: catalog.SystemMaterializedViewRel, Props: []*plan.PropertyDef{{Key: catalog.MaterializedViewProperty, Value: string(data)}}}}}}}} + tips, err := extractPrivilegeTipsFromPlan(p) + require.NoError(t, err) + require.Len(t, tips, 3) + for i, name := range []string{"src", "dimension", "stored"} { + require.Equal(t, name, tips[i].tableName) + require.Equal(t, PrivilegeTypeSelect, tips[i].typ) + require.Equal(t, "db", tips[i].databaseName) + } + p.GetQuery().Nodes[0].TableDef.Props[0].Value = "invalid" + _, err = extractPrivilegeTipsFromPlan(p) + require.Error(t, err) +} + +func TestMaterializedViewGlobalCatalogOwnership(t *testing.T) { + for _, ddl := range catalog.MaterializedViewCatalogDDLs { + require.True(t, isMaterializedViewCatalogDDL(ddl), "tenant initialization must not recreate a global MV catalog") + } +} + +func TestMaterializedViewTransactionClassification(t *testing.T) { + for _, statement := range []tree.Statement{&tree.CreateMaterializedView{}, &tree.RefreshMaterializedView{}, &tree.DropMaterializedView{}, &tree.AlterMaterializedView{}} { + allowed, err := statementCanBeExecutedInUncommittedTransaction(context.Background(), nil, statement) + require.NoError(t, err) + require.False(t, allowed) + } + allowed, err := statementCanBeExecutedInUncommittedTransaction(context.Background(), nil, &tree.ShowMaterializedViews{}) + require.NoError(t, err) + require.True(t, allowed) +} + +func TestMaterializedViewDefinerAccountStatus(t *testing.T) { + for _, status := range []string{"open", "suspend", "restricted", "unknown", "missing"} { + t.Run(status, func(t *testing.T) { + ses := newTestSession(t, gomock.NewController(t)) + t.Cleanup(ses.Close) + ses.SetAccountId(7) + ses.SetTenantInfo(getDefaultAccount()) + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + userReads := 0 + sql := executor.NewMemExecutor(func(q string) (executor.Result, error) { + if strings.HasPrefix(q, "select status from mo_catalog.mo_account") { + require.Contains(t, q, "account_id=7") + if status == "missing" { + return executor.Result{}, nil + } + r := executor.NewMemResult([]types.Type{types.T_varchar.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendBytesRows(r, 0, [][]byte{[]byte(status)})) + return r.GetResult(), nil + } + userReads++ + r := executor.NewMemResult([]types.Type{types.T_varchar.ToType(), types.T_varchar.ToType(), types.T_varchar.ToType()}, mp) + r.NewBatchWithRowCount(1) + for i, v := range []string{"owner", userStatusUnlock, "accountadmin"} { + require.NoError(t, executor.AppendBytesRows(r, i, [][]byte{[]byte(v)})) + } + return r.GetResult(), nil + }) + err := validateMaterializedViewDefiner(t.Context(), ses, mv.NewService(sql), &catalog.MVDefinition{OwnerUser: 2, OwnerRole: 3, OwnerName: "owner"}) + if status == "open" { + require.NoError(t, err) + require.Equal(t, 1, userReads) + } else { + require.ErrorContains(t, err, "account is unavailable") + require.Zero(t, userReads) + } + }) + } +} + +func TestMaterializedViewAccountRetirement(t *testing.T) { + for _, empty := range []bool{false, true} { + t.Run(fmt.Sprintf("no-result-set=%t", empty), func(t *testing.T) { + for _, count := range []int64{0, 3, 4} { + for _, fail := range []int{-1, 0, 2, 5} { + t.Run(fmt.Sprintf("catalog=%d/failure=%d", count, fail), func(t *testing.T) { + bh := mock_frontend.NewMockBackgroundExec(gomock.NewController(t)) + ctx := t.Context() + bh.EXPECT().ClearExecResultSet() + bh.EXPECT().Exec(ctx, mv.CatalogReadinessSQL).Return(nil) + bh.EXPECT().GetExecResultSet().Return([]interface{}{newMrsForCheckTenant([][]interface{}{{count}})}) + statements := accountMaterializedViewRetirementSQL(7) + injected := errors.New("retirement failed") + if count == 4 && (fail < 0 || fail > 2) { + bh.EXPECT().ClearExecResultSet() + bh.EXPECT().Exec(ctx, "select mv_id,database_name,name from mo_catalog.mo_materialized_views where account_id=7 order by mv_id limit 129").Return(nil) + var results []interface{} + if !empty { + results = []interface{}{newMrsForCheckTenant(nil)} + } + bh.EXPECT().GetExecResultSet().Return(results) + } + if count == 4 { + for i, q := range statements { + require.Contains(t, q, "7") + if i == fail { + bh.EXPECT().Exec(ctx, q).Return(injected) + break + } + bh.EXPECT().Exec(ctx, q).Return(nil) + } + } + err := retireAccountMaterializedViews(ctx, bh, 7) + if count == 3 { + require.ErrorContains(t, err, "incomplete") + } else if count == 4 && fail >= 0 { + require.ErrorIs(t, err, injected) + } else { + require.NoError(t, err) + } + }) + } + } + }) + } +} + +type materializedViewRetirementBackground struct{ BackgroundExec } + +func (materializedViewRetirementBackground) materializedViewRetirementTxnID() []byte { + return []byte("account-drop") +} + +func TestMaterializedViewAccountRetirementCapability(t *testing.T) { + ctx := t.Context() + mock := mock_frontend.NewMockBackgroundExec(gomock.NewController(t)) + bh := materializedViewRetirementBackground{mock} + count := newMrsForCheckTenant([][]interface{}{{int64(4)}}) + objects := newMrsForCheckTenant([][]interface{}{{uint64(99), "db`name", "mv`name"}}) + mock.EXPECT().ClearExecResultSet().Times(2) + calls := []*gomock.Call{mock.EXPECT().Exec(ctx, mv.CatalogReadinessSQL).Return(nil), mock.EXPECT().GetExecResultSet().Return([]interface{}{count})} + statements := accountMaterializedViewRetirementSQL(7) + for _, q := range statements[:3] { + calls = append(calls, mock.EXPECT().Exec(ctx, q).Return(nil)) + } + calls = append(calls, mock.EXPECT().Exec(ctx, "select mv_id,database_name,name from mo_catalog.mo_materialized_views where account_id=7 order by mv_id limit 129").Return(nil), mock.EXPECT().GetExecResultSet().Return([]interface{}{objects})) + calls = append(calls, mock.EXPECT().Exec(gomock.Any(), "drop table `db``name`.`mv``name`").DoAndReturn(func(c context.Context, _ string) error { + require.True(t, defines.CanWriteMaterializedView(c, 7, 99, []byte("account-drop"))) + require.False(t, defines.CanWriteMaterializedView(c, 8, 99, []byte("account-drop"))) + require.False(t, defines.CanWriteMaterializedView(c, 7, 100, []byte("account-drop"))) + require.False(t, defines.CanWriteMaterializedView(c, 7, 99, []byte("another-txn"))) + return nil + })) + for _, q := range statements[3:] { + calls = append(calls, mock.EXPECT().Exec(ctx, q).Return(nil)) + } + gomock.InOrder(calls...) + require.NoError(t, retireAccountMaterializedViews(ctx, bh, 7)) +} diff --git a/pkg/frontend/mysql_cmd_executor.go b/pkg/frontend/mysql_cmd_executor.go index 92bfce0eaaa01..8485856428d27 100644 --- a/pkg/frontend/mysql_cmd_executor.go +++ b/pkg/frontend/mysql_cmd_executor.go @@ -6013,6 +6013,10 @@ func executeStmt(ses *Session, } switch st := execCtx.stmt.(type) { + case *tree.CreateMaterializedView: + if err = checkMaterializedViewTransaction(execCtx.reqCtx, ses); err != nil { + return + } case *tree.Select: if st.Ep != nil { if getPu(ses.GetService()).SV.DisableSelectInto { @@ -6046,6 +6050,12 @@ func executeStmt(ses *Session, ses.InvalidatePrivilegeCache() // if the droped database is the same as the one in use, database must be reseted to empty. if string(st.Name) == ses.GetDatabaseName() { + previousDatabase := ses.GetDatabaseName() + defer func() { + if err != nil { + ses.SetDatabaseName(previousDatabase) + } + }() ses.SetDatabaseName("") } case *tree.ExplainAnalyze: diff --git a/pkg/frontend/pitr.go b/pkg/frontend/pitr.go index f3a581bef73a5..650ad72d8a2a7 100644 --- a/pkg/frontend/pitr.go +++ b/pkg/frontend/pitr.go @@ -1632,6 +1632,9 @@ func reCreateTableWithPitr( pitrName string, ts int64, tblInfo *tableInfo) (err error) { + if tblInfo.relKind == catalog.SystemMaterializedViewRel { + return moerr.NewNotSupported(ctx, "PITR of materialized views") + } if isExternalTable(tblInfo) { return newExternalTableRestoreError(ctx, tblInfo, "pitr") } diff --git a/pkg/frontend/self_handle.go b/pkg/frontend/self_handle.go index 9db07dcf48025..e59c6aa4acb1c 100644 --- a/pkg/frontend/self_handle.go +++ b/pkg/frontend/self_handle.go @@ -137,6 +137,22 @@ func execInFrontend(ses *Session, execCtx *ExecCtx) (stats statistic.StatsArray, if err != nil { return } + case *tree.RefreshMaterializedView: + if err = handleRefreshMaterializedView(execCtx.reqCtx, ses, st); err != nil { + return + } + case *tree.DropMaterializedView: + if err = handleDropMaterializedView(execCtx.reqCtx, ses, st); err != nil { + return + } + case *tree.AlterMaterializedView: + if err = handleAlterMaterializedView(execCtx.reqCtx, ses, st); err != nil { + return + } + case *tree.ShowMaterializedViews: + if err = handleShowMaterializedViews(execCtx.reqCtx, ses, st); err != nil { + return + } case *tree.CreateSQLTask: ses.EnterFPrint(FPCreateSQLTask) defer ses.ExitFPrint(FPCreateSQLTask) diff --git a/pkg/frontend/snapshot.go b/pkg/frontend/snapshot.go index 00b24f577a65d..97fb798eec994 100644 --- a/pkg/frontend/snapshot.go +++ b/pkg/frontend/snapshot.go @@ -112,12 +112,16 @@ var ( "mo_indexes": systemCatalogRestoreSkip, "mo_account": systemCatalogRestoreSkip, - catalog.MOVersionTable: systemCatalogRestoreSkip, - catalog.MOUpgradeTable: systemCatalogRestoreSkip, - catalog.MOUpgradeTenantTable: systemCatalogRestoreSkip, - catalog.MOAutoIncrTable: systemCatalogRestoreSkip, - catalog.MO_VIEW_DEPENDENCIES: systemCatalogRestoreSkip, - catalog.MO_VIEW_REFRESH: systemCatalogRestoreSkip, + catalog.MOVersionTable: systemCatalogRestoreSkip, + catalog.MOUpgradeTable: systemCatalogRestoreSkip, + catalog.MOUpgradeTenantTable: systemCatalogRestoreSkip, + catalog.MOAutoIncrTable: systemCatalogRestoreSkip, + catalog.MO_VIEW_DEPENDENCIES: systemCatalogRestoreSkip, + catalog.MO_VIEW_REFRESH: systemCatalogRestoreSkip, + catalog.MO_MATERIALIZED_VIEWS: systemCatalogRestoreSkip, + catalog.MO_MV_DEPENDENCIES: systemCatalogRestoreSkip, + catalog.MO_MV_REFRESH_RUNS: systemCatalogRestoreSkip, + catalog.MO_MV_ACCOUNT_STATE: systemCatalogRestoreSkip, "mo_user": systemCatalogRestoreCopy, "mo_role": systemCatalogRestoreCopy, @@ -1788,6 +1792,11 @@ func dropClusterTable( } continue } + // Subsystem-owned cluster catalogs must retain the current schema. + // Their bulk-restore policy also governs this destructive cleanup. + if needSkipSystemTable(toAccountId, tblInfo) { + continue + } getLogger(sid).Debug(fmt.Sprintf("[%s] start to drop system table: %v.%v", snapshotName, moCatalog, tblInfo.tblName)) if err = bh.Exec(ctx, dropTableIfExistsSQL(moCatalog, tblInfo.tblName)); err != nil { return @@ -2859,6 +2868,9 @@ func fillTableCreateSQLsForRestore( sequences := make([]*tableInfo, 0) restorable := make([]*tableInfo, 0, len(tableInfos)) for _, tblInfo := range tableInfos { + if tblInfo.relKind == catalog.SystemMaterializedViewRel { + return nil, moerr.NewNotSupportedNoCtx("logical restore/clone of materialized views; drop and recreate their definitions") + } createSQL, err := getCreateSQL(tblInfo) if err != nil { if moerr.IsMoErrCode(err, moerr.ErrNoSuchTable) { diff --git a/pkg/frontend/snapshot_catalog_restore_test.go b/pkg/frontend/snapshot_catalog_restore_test.go index ee9836f92aa51..c548d19c24f08 100644 --- a/pkg/frontend/snapshot_catalog_restore_test.go +++ b/pkg/frontend/snapshot_catalog_restore_test.go @@ -450,3 +450,25 @@ func TestLoadRolePrivilegesAtSnapshotValidatesCatalogRows(t *testing.T) { }) } } + +func TestClusterRestorePreservesMaterializedViewCatalogs(t *testing.T) { + ctx := defines.AttachAccountId(t.Context(), sysAccountID) + bh := &backgroundExecTest{} + bh.init() + metadata := []string{catalog.MO_MATERIALIZED_VIEWS, catalog.MO_MV_DEPENDENCIES, catalog.MO_MV_REFRESH_RUNS, catalog.MO_MV_ACCOUNT_STATE} + rows := make([][]interface{}, 0, len(metadata)+3) + for _, name := range metadata { + rows = append(rows, []interface{}{name, string(clusterTable), catalog.SystemClusterRel, ""}) + require.True(t, needSkipTable(sysAccountID, moCatalog, name)) + } + rows = append(rows, []interface{}{catalog.MO_VIEW_DEPENDENCIES, string(clusterTable), catalog.SystemClusterRel, ""}, + []interface{}{catalog.MO_VIEW_REFRESH, string(clusterTable), catalog.SystemClusterRel, ""}, + []interface{}{"user_cluster", string(clusterTable), catalog.SystemClusterRel, ""}) + query := buildTableInfoListSQL(moCatalog, "", 0, sysAccountID) + bh.sql2result[query] = newMrsForRestoreStringRows([]string{"relname", "table_type", "relkind", "viewdef"}, rows) + require.NoError(t, dropClusterTable(ctx, "", bh, "snapshot", sysAccountID)) + require.Equal(t, []string{query, "delete from mo_catalog.mo_view_dependencies", "delete from mo_catalog.mo_view_refresh", dropTableIfExistsSQL(moCatalog, "user_cluster")}, bh.executedSQLs) + for _, name := range metadata { + require.NotContains(t, bh.executedSQLs, dropTableIfExistsSQL(moCatalog, name)) + } +} diff --git a/pkg/frontend/snapshot_test.go b/pkg/frontend/snapshot_test.go index e0087cc41637c..6282b217b4a32 100644 --- a/pkg/frontend/snapshot_test.go +++ b/pkg/frontend/snapshot_test.go @@ -38,6 +38,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/container/vector" "github.com/matrixorigin/matrixone/pkg/defines" mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" + "github.com/matrixorigin/matrixone/pkg/mv" "github.com/matrixorigin/matrixone/pkg/pb/txn" "github.com/matrixorigin/matrixone/pkg/sql/compile" sqlmongodb "github.com/matrixorigin/matrixone/pkg/sql/mongodb" @@ -2121,6 +2122,7 @@ func Test_dropExistsAccount_InRestoreTransaction(t *testing.T) { bh.sql2result["rollback;"] = nil // Setup SQL results for doDropAccount (called by dropExistsAccount) + bh.sql2result[mv.CatalogReadinessSQL] = newMrsForCheckTenant([][]interface{}{{int64(0)}}) sql, _ := getSqlForCheckTenant(ctx, "test_acc") mrs := newMrsForGetAllAccounts([][]interface{}{ {uint64(1), "test_acc", "open", uint64(1), nil}, diff --git a/pkg/frontend/status_stmt.go b/pkg/frontend/status_stmt.go index ee6ec728ea0e5..3f9a237d406e9 100644 --- a/pkg/frontend/status_stmt.go +++ b/pkg/frontend/status_stmt.go @@ -171,7 +171,7 @@ func executeStatusStmt(ses *Session, execCtx *ExecCtx) (err error) { } else { return moerr.NewInternalError(execCtx.reqCtx, "select without it generates the result rows") } - case *tree.CreateTable: + case *tree.CreateTable, *tree.CreateMaterializedView: runBegin := time.Now() if execCtx.runResult, err = execCtx.runner.Run(0); err != nil { return diff --git a/pkg/frontend/stmt_kind.go b/pkg/frontend/stmt_kind.go index 081b7dca8802a..590c9f2b83831 100644 --- a/pkg/frontend/stmt_kind.go +++ b/pkg/frontend/stmt_kind.go @@ -318,6 +318,10 @@ func statementCanBeExecutedInUncommittedTransaction( USE ROLE role; */ return !st.IsUseRole(), nil + case *tree.CreateMaterializedView, *tree.RefreshMaterializedView, *tree.DropMaterializedView, *tree.AlterMaterializedView: + return false, nil + case *tree.ShowMaterializedViews: + return true, nil case *tree.DropTable, *tree.DropIndex, *tree.DropView, *tree.TruncateTable, *tree.RenameTable: return true, nil case *tree.DropSequence: //Case1, Case3 above diff --git a/pkg/frontend/variables.go b/pkg/frontend/variables.go index 233d0c86b4939..4f1ad09734934 100644 --- a/pkg/frontend/variables.go +++ b/pkg/frontend/variables.go @@ -3948,6 +3948,10 @@ var gSysVarsDefs = map[string]SystemVariable{ Type: InitSystemVariableStringType("remap_rewrites"), Default: "", }, + "experimental_materialized_view": { + Name: "experimental_materialized_view", Scope: ScopeBoth, Dynamic: true, SetVarHintApplies: false, + Type: InitSystemVariableBoolType("experimental_materialized_view"), Default: int8(0), + }, "experimental_ivf_index": { Name: "experimental_ivf_index", Scope: ScopeBoth, diff --git a/pkg/mv/service.go b/pkg/mv/service.go new file mode 100644 index 0000000000000..b06a848a281d9 --- /dev/null +++ b/pkg/mv/service.go @@ -0,0 +1,432 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mv + +import ( + "context" + "encoding/json" + "fmt" + "strings" + "time" + + "github.com/google/uuid" + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/common/sqlquote" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/pb/timestamp" + "github.com/matrixorigin/matrixone/pkg/pb/txn" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "github.com/matrixorigin/matrixone/pkg/util/fault" +) + +const RuntimeKey = "materialized-view-service" +const Timeout = 300 * time.Second + +type Key struct { + Account uint32 + ID uint64 +} +type State struct { + Key + Database, Name string + Definition catalog.MVDefinition + Epoch, Requested, Successful uint64 + Populated bool + LastRun string + SourceTS timestamp.Timestamp + Interval int64 +} + +// Service owns bounded per-CN admission, not cluster-wide publication locks. +// Fixed account buckets conservatively serialize collisions without a growing +// tenant-to-semaphore map. Transaction conflict detection fences publishers. +type Service struct { + SQL executor.SQLExecutor + slots chan struct{} + accounts [256]chan struct{} + pending [256]chan struct{} +} + +func NewService(sql executor.SQLExecutor) *Service { + s := &Service{SQL: sql, slots: make(chan struct{}, 2)} + for i := range s.accounts { + s.accounts[i] = make(chan struct{}, 1) + s.pending[i] = make(chan struct{}, 2) + } + return s +} +func Quote(s string) string { return "`" + strings.ReplaceAll(s, "`", "``") + "`" } +func literal(s string) string { return "'" + sqlquote.EscapeString(s) + "'" } +func system() executor.StatementOption { + return executor.StatementOption{}.WithAccountID(catalog.System_Account).WithDisableLog() +} +func consume(tx executor.TxnExecutor, sql string) error { + r, e := tx.Exec(sql, system()) + if e == nil { + r.Close() + } + return e +} + +func Load(tx executor.TxnExecutor, key Key) (*State, error) { + r, err := tx.Exec(fmt.Sprintf("select database_name,name,definition,epoch,requested_sequence,successful_sequence,populated,last_run,source_physical,source_logical,interval_seconds from mo_catalog.mo_materialized_views where account_id=%d and mv_id=%d", key.Account, key.ID), system()) + if err != nil { + return nil, err + } + defer r.Close() + var st *State + var decodeErr error + r.ReadRows(func(rows int, c []*vector.Vector) bool { + for i := 0; i < rows; i++ { + if st != nil { + decodeErr = moerr.NewInternalErrorNoCtx("duplicate materialized view metadata") + return false + } + st = &State{Key: key, Database: c[0].GetStringAt(i), Name: c[1].GetStringAt(i), Epoch: vector.GetFixedAtWithTypeCheck[uint64](c[3], i), Requested: vector.GetFixedAtWithTypeCheck[uint64](c[4], i), Successful: vector.GetFixedAtWithTypeCheck[uint64](c[5], i), Populated: vector.GetFixedAtWithTypeCheck[bool](c[6], i), LastRun: c[7].GetStringAt(i), SourceTS: timestamp.Timestamp{PhysicalTime: vector.GetFixedAtWithTypeCheck[int64](c[8], i), LogicalTime: vector.GetFixedAtWithTypeCheck[uint32](c[9], i)}, Interval: vector.GetFixedAtWithTypeCheck[int64](c[10], i)} + definition, err := catalog.DecodeMaterializedViewDefinition(c[2].GetStringAt(i)) + decodeErr = err + if err == nil { + st.Definition = *definition + } + } + return decodeErr == nil + }) + if decodeErr != nil { + return nil, decodeErr + } + if st == nil { + return nil, moerr.NewInvalidInputNoCtx("materialized view metadata does not exist") + } + return st, nil +} + +func ValidateSources(tx executor.TxnExecutor, st *State) error { + for _, d := range st.Definition.Sources { + if d.AccountID != st.Account || d.Database != st.Database { + return moerr.NewInvalidInputNoCtx("invalid materialized view source account/database") + } + r, err := tx.Exec(fmt.Sprintf("select rel_id,rel_logical_id,rel_version from mo_catalog.mo_tables where account_id=%d and reldatabase_id=%d and relname=%s", d.AccountID, d.DatabaseID, literal(d.Table)), system()) + if err != nil { + return err + } + valid, rows := false, 0 + r.ReadRows(func(n int, c []*vector.Vector) bool { + rows += n + for i := 0; i < n; i++ { + valid = vector.GetFixedAtWithTypeCheck[uint64](c[0], i) == d.TableID && vector.GetFixedAtWithTypeCheck[uint64](c[1], i) == d.LogicalID && vector.GetFixedAtWithTypeCheck[uint32](c[2], i) == d.Version + } + return true + }) + r.Close() + if rows != 1 || !valid { + return moerr.NewInvalidInputNoCtx("MV_INVALID_DEFINITION: materialized view source identity/schema changed") + } + } + return nil +} + +// Register is called by CREATE in the same transaction as native relation creation. +func Register(tx executor.TxnExecutor, key Key, databaseID uint64, name string, definition *catalog.MVDefinition) error { + if err := DependencyGuard(tx, key.Account); err != nil { + return err + } + r, err := tx.Exec(fmt.Sprintf("select count(*) from mo_catalog.mo_materialized_views where account_id=%d", key.Account), system()) + if err != nil { + return err + } + var count int64 + r.ReadRows(func(n int, c []*vector.Vector) bool { + if n > 0 { + count = vector.GetFixedAtWithTypeCheck[int64](c[0], 0) + } + return true + }) + r.Close() + if count >= 128 { + return moerr.NewInvalidInputNoCtx("materialized view account limit (128) exceeded") + } + st := &State{Key: key, Database: definition.Database, Name: name, Definition: *definition} + if err := ValidateSources(tx, st); err != nil { + return err + } + data, err := json.Marshal(definition) + if err != nil { + return err + } + err = consume(tx, fmt.Sprintf("insert into mo_catalog.mo_materialized_views (account_id,mv_id,database_id,database_name,name,definition,interval_seconds,next_due) values (%d,%d,%d,%s,%s,%s,%d,%s)", key.Account, key.ID, databaseID, literal(definition.Database), literal(name), literal(string(data)), definition.IntervalSeconds, nextDueSQL(definition.IntervalSeconds))) + if err != nil { + return err + } + for _, d := range definition.Sources { + if err := consume(tx, fmt.Sprintf("insert into mo_catalog.mo_mv_dependencies (account_id,mv_id,source_database_id,source_table_id,source_logical_id,source_version) values (%d,%d,%d,%d,%d,%d)", key.Account, key.ID, d.DatabaseID, d.TableID, d.LogicalID, d.Version)); err != nil { + return err + } + } + return nil +} +func nextDueSQL(seconds int64) string { + if seconds == 0 { + return "null" + } + return fmt.Sprintf("date_add(current_timestamp(),interval %d second)", seconds) +} + +// CatalogReadinessSQL uses only the pre-existing system metadata catalog. All +// four global MV tables must be installed in the caller's transaction snapshot; +// a registered CN service or a session feature flag is not migration readiness. +const CatalogReadinessSQL = "select count(*) from mo_catalog.mo_tables where account_id=0 and reldatabase='mo_catalog' and relname in ('mo_materialized_views','mo_mv_dependencies','mo_mv_refresh_runs','mo_mv_account_state')" + +func CatalogReady(tx executor.TxnExecutor) (bool, error) { + r, err := tx.Exec(CatalogReadinessSQL, system()) + if err != nil { + return false, err + } + defer r.Close() + var count int64 + r.ReadRows(func(n int, c []*vector.Vector) bool { + if n > 0 { + count = vector.GetFixedAtWithTypeCheck[int64](c[0], 0) + } + return false + }) + if count != 0 && count != 4 { + return false, moerr.NewInternalErrorNoCtx("incomplete materialized view catalog migration") + } + return count == 4, nil +} + +func DependencyGuard(tx executor.TxnExecutor, account uint32) error { + if err := consume(tx, fmt.Sprintf("insert ignore into mo_catalog.mo_mv_account_state (account_id,revision) values (%d,0)", account)); err != nil { + return err + } + return consume(tx, fmt.Sprintf("update mo_catalog.mo_mv_account_state set revision=revision+1 where account_id=%d", account)) +} + +// Refresh publishes stored rows and their exact source snapshot together. +// Callers authorize the current user/owner and require protocol admission first. +func (s *Service) Refresh(ctx context.Context, key Key, expectedEpoch uint64) error { + ctx, cancel := context.WithTimeout(ctx, Timeout) + defer cancel() + if err := ctx.Err(); err != nil { + return err + } + // Bound both active and waiting requests without a growing per-tenant map. + // One active request and one waiter may occupy an account hash bucket. + pending := s.pending[key.Account%uint32(len(s.pending))] + select { + case pending <- struct{}{}: + defer func() { <-pending }() + default: + return moerr.NewInvalidInput(ctx, "MV_REFRESH_BUSY: refresh admission is full") + } + bucket := s.accounts[key.Account%uint32(len(s.accounts))] + select { + case bucket <- struct{}{}: + defer func() { <-bucket }() + case <-ctx.Done(): + return ctx.Err() + } + select { + case s.slots <- struct{}{}: + defer func() { <-s.slots }() + case <-ctx.Done(): + return ctx.Err() + } + runID := uuid.NewString() + if background, ok := defines.GetMaterializedViewTask(ctx); ok { + if background.Account != key.Account || background.Table != key.ID || background.Epoch != expectedEpoch || background.RunID == "" { + return moerr.NewInvalidInputNoCtx("invalid materialized view task identity") + } + runID = background.RunID + } + var sequence, epoch uint64 + var definition catalog.MVDefinition + var zone *time.Location + opts := executor.Options{}.WithAccountID(key.Account).WithTxnIsolation(txn.TxnIsolation_SI).WithTxnMode(txn.TxnMode_Optimistic).WithWaitCommittedLogApplied() + err := s.retryTxn(ctx, func(tx executor.TxnExecutor) error { + st, err := Load(tx, key) + if err != nil { + return err + } + zone, err = st.Definition.RefreshTimeZone() + if err != nil { + return err + } + if expectedEpoch != 0 && expectedEpoch != st.Epoch { + return moerr.NewInvalidInputNoCtx("obsolete materialized view refresh task") + } + if prior, err := loadRun(tx, key, runID); err != nil { + return err + } else if prior != nil { + sequence = prior.sequence + epoch = prior.epoch + definition = st.Definition + if epoch != st.Epoch { + return moerr.NewInvalidInputNoCtx("obsolete materialized view refresh attempt") + } + if st.Successful < sequence { + return consume(tx, fmt.Sprintf("update mo_catalog.mo_mv_refresh_runs set status='RUNNING',started_at=current_timestamp(),finished_at=null,error_message='' where account_id=%d and mv_id=%d and run_id=%s", key.Account, key.ID, literal(runID))) + } + return nil + } + if st.Requested == ^uint64(0) { + return moerr.NewInvalidInputNoCtx("materialized view refresh sequence exhausted") + } + sequence = st.Requested + 1 + epoch = st.Epoch + definition = st.Definition + if err := consume(tx, fmt.Sprintf("update mo_catalog.mo_materialized_views set requested_sequence=%d where account_id=%d and mv_id=%d and epoch=%d", sequence, key.Account, key.ID, epoch)); err != nil { + return err + } + return consume(tx, fmt.Sprintf("insert into mo_catalog.mo_mv_refresh_runs (account_id,mv_id,run_id,sequence,epoch,status,started_at) values (%d,%d,%s,%d,%d,'RUNNING',current_timestamp())", key.Account, key.ID, literal(runID), sequence, epoch)) + }, opts) + if err != nil { + return err + } + // Only the persisted source SQL inherits authoring context. Control-plane SQL + // uses the executor's default literal escaping, including source names with + // backslashes, and must keep its own parser mode. + sourceOpts := opts.WithDatabase(definition.Database).WithTimeZone(zone).WithLowerCaseTableNames(&definition.LowerCaseTableNames).WithParserSQLMode(definition.SQLMode).WithResolveVariableFunc(func(name string, system, global bool) (interface{}, error) { + if system && !global { + switch strings.ToLower(name) { + case "sql_mode": + return definition.SQLMode, nil + case "div_precision_increment": + return int64(*definition.DivPrecisionIncrement), nil + } + } + if executor.DefaultResolveVariable != nil { + return executor.DefaultResolveVariable(name, system, global) + } + return nil, moerr.NewInvalidInputNoCtx("unsupported refresh session variable") + }) + err = s.retryTxn(ctx, func(tx executor.TxnExecutor) error { + st, err := Load(tx, key) + if err != nil { + return err + } + if st.LastRun == runID { + return nil + } + if st.Successful >= sequence { + return consume(tx, fmt.Sprintf("update mo_catalog.mo_mv_refresh_runs set status='SUPERSEDED',finished_at=current_timestamp() where account_id=%d and mv_id=%d and run_id=%s and status='RUNNING'", key.Account, key.ID, literal(runID))) + } + if st.Epoch != epoch { + return moerr.NewInvalidInputNoCtx("materialized view definition changed during refresh") + } + if err := ValidateSources(tx, st); err != nil { + return err + } + if err := consume(tx, fmt.Sprintf("update mo_catalog.mo_materialized_views set successful_sequence=%d where account_id=%d and mv_id=%d and epoch=%d", sequence, key.Account, key.ID, epoch)); err != nil { + return err + } + ts := tx.Txn().SnapshotTS() + writeCtx := defines.WithMaterializedViewBudget(defines.WithMaterializedViewWrite(ctx, key.Account, key.ID, tx.Txn().Txn().ID), key.ID, 512<<20) + writeOpts := sourceOpts.WithTxn(tx.Txn()) + target := Quote(st.Database) + "." + Quote(st.Name) + for _, sql := range []string{"delete from " + target, "insert into " + target + " " + definition.Query} { + r, err := s.SQL.Exec(writeCtx, sql, writeOpts) + if err != nil { + return err + } + r.Close() + } + if !tx.Txn().SnapshotTS().Equal(ts) { + return moerr.NewInternalErrorNoCtx("materialized view refresh source snapshot changed") + } + if err := consume(tx, fmt.Sprintf("update mo_catalog.mo_materialized_views set populated=true,last_run=%s,source_physical=%d,source_logical=%d,last_success=current_timestamp(),next_due=%s where account_id=%d and mv_id=%d and epoch=%d", literal(runID), ts.PhysicalTime, ts.LogicalTime, nextDueSQL(st.Interval), key.Account, key.ID, epoch)); err != nil { + return err + } + if err := consume(tx, fmt.Sprintf("update mo_catalog.mo_mv_refresh_runs set status='SUCCEEDED',finished_at=current_timestamp(),source_physical=%d,source_logical=%d where account_id=%d and mv_id=%d and run_id=%s", ts.PhysicalTime, ts.LogicalTime, key.Account, key.ID, literal(runID))); err != nil { + return err + } + // Native recovery tests stop the CN with all replacement writes still + // uncommitted. Disabled fault injection is a single atomic pointer read. + fault.TriggerFaultWithContext(ctx, "mv_refresh_before_commit") + return nil + }, opts) + if err == nil { + // This boundary is after durable publication and before the task runner + // receives its acknowledgement. ECHO(1) models a lost commit response; + // WAIT lets a native test kill this CN without stopping the TN. + if lost, _, _ := fault.TriggerFaultWithContext(ctx, "mv_refresh_after_commit"); lost == 1 { + err = moerr.NewInternalErrorNoCtx("injected materialized view commit response loss") + } + } + if err != nil { + // Diagnostic failure recording never changes the last-good result. A + // conditional RUNNING update cannot overwrite a committed success. + cleanupCtx, cleanupCancel := context.WithTimeout(context.WithoutCancel(ctx), 5*time.Second) + defer cleanupCancel() + // Resolve a lost commit response before reporting failure. + if committed, checkErr := s.State(cleanupCtx, key); checkErr == nil && committed.LastRun == runID { + return nil + } + message := "refresh failed" // Do not persist raw SQL/data/connection error strings. + r, recordErr := s.SQL.Exec(cleanupCtx, fmt.Sprintf("update mo_catalog.mo_mv_refresh_runs set status='FAILED',finished_at=current_timestamp(),error_message=%s where account_id=%d and mv_id=%d and run_id=%s and status='RUNNING'", literal(message), key.Account, key.ID, literal(runID)), executor.Options{}.WithAccountID(catalog.System_Account)) + if recordErr == nil { + r.Close() + } + r, scheduleErr := s.SQL.Exec(cleanupCtx, fmt.Sprintf("update mo_catalog.mo_materialized_views set next_due=date_add(current_timestamp(),interval 60 second) where account_id=%d and mv_id=%d and epoch=%d and interval_seconds>0 and last_run<>%s", key.Account, key.ID, epoch, literal(runID)), executor.Options{}.WithAccountID(catalog.System_Account)) + if scheduleErr == nil { + r.Close() + } + } + return err +} + +func (s *Service) State(ctx context.Context, key Key) (*State, error) { + ctx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() + var st *State + err := s.SQL.ExecTxn(ctx, func(tx executor.TxnExecutor) error { var err error; st, err = Load(tx, key); return err }, executor.Options{}.WithAccountID(key.Account)) + return st, err +} + +type refreshRun struct { + sequence, epoch uint64 + status string +} + +func loadRun(tx executor.TxnExecutor, key Key, id string) (*refreshRun, error) { + r, err := tx.Exec(fmt.Sprintf("select sequence,epoch,status from mo_catalog.mo_mv_refresh_runs where account_id=%d and mv_id=%d and run_id=%s", key.Account, key.ID, literal(id)), system()) + if err != nil { + return nil, err + } + defer r.Close() + var run *refreshRun + r.ReadRows(func(n int, c []*vector.Vector) bool { + if n > 0 { + run = &refreshRun{vector.GetFixedAtWithTypeCheck[uint64](c[0], 0), vector.GetFixedAtWithTypeCheck[uint64](c[1], 0), c[2].GetStringAt(0)} + } + return false + }) + return run, nil +} +func (s *Service) retryTxn(ctx context.Context, fn func(executor.TxnExecutor) error, opts executor.Options) error { + var err error + for attempt := 0; attempt < 3; attempt++ { + if ctx.Err() != nil { + return ctx.Err() + } + err = s.SQL.ExecTxn(ctx, fn, opts) + if !moerr.IsMoErrCode(err, moerr.ErrTxnWWConflict) && !moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetry) && !moerr.IsMoErrCode(err, moerr.ErrTxnNeedRetryWithDefChanged) { + return err + } + } + return err +} diff --git a/pkg/mv/service_test.go b/pkg/mv/service_test.go new file mode 100644 index 0000000000000..5848ac8f47015 --- /dev/null +++ b/pkg/mv/service_test.go @@ -0,0 +1,398 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mv + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "strings" + "testing" + "time" + + "github.com/golang/mock/gomock" + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/common/mpool" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/defines" + mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" + "github.com/matrixorigin/matrixone/pkg/pb/timestamp" + "github.com/matrixorigin/matrixone/pkg/pb/txn" + "github.com/matrixorigin/matrixone/pkg/txn/client" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "github.com/matrixorigin/matrixone/pkg/util/fault" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewSourceIdentity(t *testing.T) { + mp := mpool.MustNewZero() + defer require.Zero(t, mp.CurrNB()) + st := &State{Key: Key{7, 99}, Database: "db", Definition: catalog.MVDefinition{Sources: []catalog.MVSource{{AccountID: 7, DatabaseID: 2, TableID: 3, LogicalID: 4, Version: 5, Database: "db", Table: "t"}}}} + for _, version := range []uint32{5, 6} { + tx := executor.NewMemTxnExecutor(func(sql string) (executor.Result, error) { + require.Contains(t, sql, "account_id=7 and reldatabase_id=2") + r := executor.NewMemResult([]types.Type{types.T_uint64.ToType(), types.T_uint64.ToType(), types.T_uint32.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint64{3})) + require.NoError(t, executor.AppendFixedRows(r, 1, []uint64{4})) + require.NoError(t, executor.AppendFixedRows(r, 2, []uint32{version})) + return r.GetResult(), nil + }, nil) + err := ValidateSources(tx, st) + if version == 5 { + require.NoError(t, err) + } else { + require.ErrorContains(t, err, "MV_INVALID_DEFINITION") + } + } + st.Definition.Sources[0].AccountID = 8 + tx := executor.NewMemTxnExecutor(func(string) (executor.Result, error) { + t.Fatal("invalid account reached SQL") + return executor.Result{}, nil + }, nil) + require.Error(t, ValidateSources(tx, st)) +} +func TestMaterializedViewTaskIdentity(t *testing.T) { + a := runMetadata(Key{7, 99}, 2, 10) + require.LessOrEqual(t, len(a.ID), 50, "task storage metadata ID width") + require.Equal(t, a, runMetadata(Key{7, 99}, 2, 10)) + require.NotEqual(t, a.ID, runMetadata(Key{7, 100}, 2, 10).ID) + require.NotEqual(t, a.ID, runMetadata(Key{7, 99}, 3, 10).ID) + require.NotEqual(t, a.ID, runMetadata(Key{7, 99}, 2, 11).ID) + var spec TaskSpec + require.NoError(t, json.Unmarshal(a.Context, &spec)) + require.Equal(t, uint64(99), spec.Key.ID) + require.Len(t, spec.RunID, 64) + s := NewService(executor.NewMemExecutor(func(string) (executor.Result, error) { + t.Fatal("cancelled admission reached SQL") + return executor.Result{}, nil + })) + s.accounts[7] <- struct{}{} + ctx, cancel := context.WithCancel(context.Background()) + cancel() + require.ErrorIs(t, s.Refresh(ctx, Key{7, 99}, 0), context.Canceled) +} + +type refreshExecutor struct { + executor.SQLExecutor + t *testing.T + op client.TxnOperator + mp *mpool.MPool + state State + failInsert bool + failPublish bool + conflictOnce bool + changeEpoch bool + loseCommitResponse bool + prior *refreshRun + lastPublication string + failureRecords int + dataWrites int + publications int + commits, rollbacks int +} + +func (e *refreshExecutor) ExecTxn(ctx context.Context, f func(executor.TxnExecutor) error, opts executor.Options) error { + if e.conflictOnce { + e.conflictOnce = false + return moerr.NewTxnWWConflictNoCtx(99, "injected conflict") + } + _, bounded := ctx.Deadline() + require.True(e.t, bounded, "native transaction operations require a deadline") + tx := executor.NewMemTxnExecutor(e.statement, e.op) + err := f(tx) + if err != nil { + e.rollbacks++ + } else { + e.commits++ + if e.publications > 0 { + e.state.LastRun = e.lastPublication + } + if e.changeEpoch && e.commits == 1 { + e.state.Epoch++ + } + if e.loseCommitResponse && e.publications > 0 { + e.loseCommitResponse = false + e.state.LastRun = e.lastPublication + return errors.New("lost commit response") + } + } + return err +} +func (e *refreshExecutor) Exec(ctx context.Context, sql string, opts executor.Options) (executor.Result, error) { + if strings.HasPrefix(sql, "delete from `db`.`stored`") || strings.HasPrefix(sql, "insert into `db`.`stored`") { + require.Same(e.t, e.op, opts.Txn()) + require.True(e.t, defines.CanWriteMaterializedView(ctx, 7, 99, e.op.Txn().ID)) + e.dataWrites++ + if e.failInsert && strings.HasPrefix(sql, "insert") { + return executor.Result{}, errors.New("injected source/write failure") + } + } + return e.statement(sql) +} +func (e *refreshExecutor) statement(sql string) (executor.Result, error) { + if strings.Contains(sql, "set status='FAILED'") { + e.failureRecords++ + } + if strings.HasPrefix(sql, "select sequence,") && e.prior != nil { + r := executor.NewMemResult([]types.Type{types.T_uint64.ToType(), types.T_uint64.ToType(), types.T_varchar.ToType()}, e.mp) + r.NewBatchWithRowCount(1) + require.NoError(e.t, executor.AppendFixedRows(r, 0, []uint64{e.prior.sequence})) + require.NoError(e.t, executor.AppendFixedRows(r, 1, []uint64{e.prior.epoch})) + require.NoError(e.t, executor.AppendStringRows(r, 2, []string{e.prior.status})) + return r.GetResult(), nil + } + if strings.HasPrefix(sql, "select database_name,") { + return e.stateResult(), nil + } + if strings.HasPrefix(sql, "select rel_id,") { + r := executor.NewMemResult([]types.Type{types.T_uint64.ToType(), types.T_uint64.ToType(), types.T_uint32.ToType()}, e.mp) + r.NewBatchWithRowCount(1) + require.NoError(e.t, executor.AppendFixedRows(r, 0, []uint64{3})) + require.NoError(e.t, executor.AppendFixedRows(r, 1, []uint64{4})) + require.NoError(e.t, executor.AppendFixedRows(r, 2, []uint32{5})) + return r.GetResult(), nil + } + if strings.HasPrefix(sql, "update mo_catalog.mo_materialized_views set populated=true") { + if e.failPublish { + return executor.Result{}, errors.New("injected publication failure") + } + e.publications++ + e.lastPublication = strings.SplitN(strings.SplitN(sql, "last_run='", 2)[1], "'", 2)[0] + require.Contains(e.t, sql, "source_physical=123,source_logical=17") + } + return executor.Result{}, nil +} +func (e *refreshExecutor) stateResult() executor.Result { + data, err := json.Marshal(e.state.Definition) + require.NoError(e.t, err) + r := executor.NewMemResult([]types.Type{types.T_varchar.ToType(), types.T_varchar.ToType(), types.T_text.ToType(), types.T_uint64.ToType(), types.T_uint64.ToType(), types.T_uint64.ToType(), types.T_bool.ToType(), types.T_varchar.ToType(), types.T_int64.ToType(), types.T_uint32.ToType(), types.T_int64.ToType()}, e.mp) + r.NewBatchWithRowCount(1) + for i, s := range []string{"db", "stored", string(data)} { + require.NoError(e.t, executor.AppendStringRows(r, i, []string{s})) + } + require.NoError(e.t, executor.AppendFixedRows(r, 3, []uint64{e.state.Epoch})) + require.NoError(e.t, executor.AppendFixedRows(r, 4, []uint64{e.state.Requested})) + require.NoError(e.t, executor.AppendFixedRows(r, 5, []uint64{e.state.Successful})) + require.NoError(e.t, executor.AppendFixedRows(r, 6, []bool{true})) + require.NoError(e.t, executor.AppendStringRows(r, 7, []string{e.state.LastRun})) + require.NoError(e.t, executor.AppendFixedRows(r, 8, []int64{5})) + require.NoError(e.t, executor.AppendFixedRows(r, 9, []uint32{6})) + require.NoError(e.t, executor.AppendFixedRows(r, 10, []int64{e.state.Interval})) + return r.GetResult() +} +func TestMaterializedViewRefreshTransaction(t *testing.T) { + for _, tc := range []struct { + name string + fail bool + epoch uint64 + }{{"success", false, 2}, {"insert failure", true, 2}, {"obsolete epoch", false, 3}} { + t.Run(tc.name, func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + op.EXPECT().SnapshotTS().Return(timestamp.Timestamp{PhysicalTime: 123, LogicalTime: 17}).AnyTimes() + op.EXPECT().Txn().Return(txn.TxnMeta{ID: []byte("refresh-txn")}).AnyTimes() + e := &refreshExecutor{t: t, op: op, mp: mp, failInsert: tc.fail, state: State{Key: Key{7, 99}, Epoch: 2, Requested: 10, Successful: 9, Definition: catalog.MVDefinition{FormatVersion: catalog.MVDefinitionFormatVersion, DivPrecisionIncrement: new(int32(4)), TimeZoneKind: "fixed", Database: "db", Query: "select * from t", TimeZone: "UTC", Sources: []catalog.MVSource{{AccountID: 7, DatabaseID: 2, TableID: 3, LogicalID: 4, Version: 5, Database: "db", Table: "t"}}}}} + s := NewService(e) + err := s.Refresh(context.Background(), Key{7, 99}, tc.epoch) + require.Zero(t, len(s.slots)) + require.Zero(t, len(s.accounts[7])) + switch tc.name { + case "success": + require.NoError(t, err) + require.Equal(t, 2, e.dataWrites) + require.Equal(t, 1, e.publications) + require.Equal(t, 2, e.commits) + case "insert failure": + require.ErrorContains(t, err, "injected") + require.Equal(t, 2, e.dataWrites) + require.Zero(t, e.publications) + require.Equal(t, 1, e.rollbacks) + case "obsolete epoch": + require.ErrorContains(t, err, "obsolete") + require.Zero(t, e.dataWrites) + require.Zero(t, e.publications) + } + }) + } +} + +func TestMaterializedViewRefreshFailureBoundaries(t *testing.T) { + for _, scenario := range []string{"metadata publication failure", "source snapshot drift", "definition changed", "lost commit response", "injected post-commit response loss", "retry conflict", "task replay", "obsolete replay epoch", "invalid task account"} { + t.Run(scenario, func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + op.EXPECT().Txn().Return(txn.TxnMeta{ID: []byte("refresh-txn")}).AnyTimes() + snapshots := 0 + op.EXPECT().SnapshotTS().DoAndReturn(func() timestamp.Timestamp { + snapshots++ + ts := timestamp.Timestamp{PhysicalTime: 123, LogicalTime: 17} + if scenario == "source snapshot drift" && snapshots > 1 { + ts.LogicalTime++ + } + return ts + }).AnyTimes() + e := &refreshExecutor{t: t, op: op, mp: mp, state: State{Key: Key{7, 99}, Epoch: 2, Requested: 10, Successful: 9, LastRun: "last-good", Definition: catalog.MVDefinition{FormatVersion: catalog.MVDefinitionFormatVersion, DivPrecisionIncrement: new(int32(4)), TimeZoneKind: "fixed", Database: "db", Query: "select * from t", TimeZone: "UTC", SQLMode: "NO_UNSIGNED_SUBTRACTION", Sources: []catalog.MVSource{{AccountID: 7, DatabaseID: 2, TableID: 3, LogicalID: 4, Version: 5, Database: "db", Table: "t"}}}}} + runID := strings.Repeat("a", 64) + ctx := context.Background() + switch scenario { + case "metadata publication failure": + e.failPublish = true + case "definition changed": + e.changeEpoch = true + case "lost commit response": + e.loseCommitResponse = true + case "injected post-commit response loss": + enabledHere := fault.Enable() + t.Cleanup(func() { + if enabledHere { + defer fault.Disable() + } + _, err := fault.RemoveFaultPoint(context.Background(), "mv_refresh_after_commit") + require.NoError(t, err) + }) + require.NoError(t, fault.AddFaultPoint(context.Background(), "mv_refresh_after_commit", ":::", "echo", 1, "", false)) + case "retry conflict": + e.conflictOnce = true + case "task replay": + e.prior = &refreshRun{11, 2, "SUCCEEDED"} + e.state.LastRun = runID + e.state.Successful = 11 + ctx = defines.WithMaterializedViewTask(ctx, defines.MaterializedViewTask{Account: 7, Table: 99, Epoch: 2, RunID: runID}) + case "obsolete replay epoch": + e.prior = &refreshRun{11, 1, "RUNNING"} + ctx = defines.WithMaterializedViewTask(ctx, defines.MaterializedViewTask{Account: 7, Table: 99, Epoch: 2, RunID: runID}) + case "invalid task account": + ctx = defines.WithMaterializedViewTask(ctx, defines.MaterializedViewTask{Account: 8, Table: 99, Epoch: 2, RunID: runID}) + } + service := NewService(e) + err := service.Refresh(ctx, Key{7, 99}, 2) + switch scenario { + case "retry conflict", "lost commit response", "injected post-commit response loss": + require.NoError(t, err) + require.Equal(t, 2, e.dataWrites) + require.Equal(t, 1, e.publications) + require.Zero(t, e.failureRecords) + case "task replay": + require.NoError(t, err) + require.Zero(t, e.dataWrites) + require.Zero(t, e.publications) + default: + require.Error(t, err) + require.Zero(t, e.publications) + if scenario == "source snapshot drift" || scenario == "metadata publication failure" { + require.Equal(t, 2, e.dataWrites) + } else { + require.Zero(t, e.dataWrites) + } + } + require.Zero(t, len(service.slots)) + require.Zero(t, len(service.accounts[7])) + }) + } +} + +func TestMaterializedViewBoundedAdmission(t *testing.T) { + s := NewService(executor.NewMemExecutor(func(string) (executor.Result, error) { + t.Fatal("full admission reached SQL") + return executor.Result{}, nil + })) + s.pending[7] <- struct{}{} + s.pending[7] <- struct{}{} + require.ErrorContains(t, s.Refresh(context.Background(), Key{7, 99}, 0), "MV_REFRESH_BUSY") + require.Equal(t, 2, len(s.pending[7])) + require.Zero(t, len(s.accounts[7])) + require.Zero(t, len(s.slots)) +} + +func TestMaterializedViewCapturedTimeZone(t *testing.T) { + for _, zone := range []struct { + name string + offset int32 + }{{"+08:00", 28800}, {"UTC", 0}, {"Local", -18000}} { + t.Run(zone.name, func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + op.EXPECT().Txn().Return(txn.TxnMeta{ID: []byte("refresh-txn")}).AnyTimes() + op.EXPECT().SnapshotTS().Return(timestamp.Timestamp{PhysicalTime: 123, LogicalTime: 17}).AnyTimes() + e := &refreshExecutor{t: t, op: op, mp: mp, state: State{Key: Key{7, 99}, Epoch: 1, Definition: catalog.MVDefinition{FormatVersion: catalog.MVDefinitionFormatVersion, DivPrecisionIncrement: new(int32(4)), TimeZoneKind: "fixed", Database: "db", Query: "select * from t", TimeZone: zone.name, TimeZoneOffset: zone.offset, SQLMode: "PIPES_AS_CONCAT,NO_BACKSLASH_ESCAPES", Sources: []catalog.MVSource{{AccountID: 7, DatabaseID: 2, TableID: 3, LogicalID: 4, Version: 5, Database: "db", Table: "t"}}}}} + wrapped := &zoneExecutor{refreshExecutor: e, offset: int(zone.offset)} + require.NoError(t, NewService(wrapped).Refresh(context.Background(), Key{7, 99}, 0)) + }) + } +} + +type zoneExecutor struct { + *refreshExecutor + offset int +} + +func (e *zoneExecutor) ExecTxn(ctx context.Context, f func(executor.TxnExecutor) error, opts executor.Options) error { + require.Empty(e.t, opts.ParserSQLMode(), "metadata SQL must retain its own literal/parser contract") + return e.refreshExecutor.ExecTxn(ctx, f, opts) +} + +func (e *zoneExecutor) Exec(ctx context.Context, sql string, opts executor.Options) (executor.Result, error) { + if strings.HasPrefix(sql, "insert into `db`.`stored`") { + require.Equal(e.t, e.state.Definition.SQLMode, opts.ParserSQLMode()) + _, offset := time.Unix(0, 0).In(opts.GetTimeZone()).Zone() + require.Equal(e.t, e.offset, offset) + } + return e.refreshExecutor.Exec(ctx, sql, opts) +} + +func TestMaterializedViewCatalogReadiness(t *testing.T) { + for _, count := range []int64{0, 1, 3, 4} { + t.Run(fmt.Sprint(count), func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + tx := executor.NewMemTxnExecutor(func(sql string) (executor.Result, error) { + require.Equal(t, CatalogReadinessSQL, sql) + r := executor.NewMemResult([]types.Type{types.T_int64.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []int64{count})) + return r.GetResult(), nil + }, nil) + ready, err := CatalogReady(tx) + if count == 0 || count == 4 { + require.NoError(t, err) + require.Equal(t, count == 4, ready) + } else { + require.ErrorContains(t, err, "incomplete") + require.False(t, ready) + } + }) + } + injected := errors.New("catalog read failed") + ready, err := CatalogReady(executor.NewMemTxnExecutor(func(string) (executor.Result, error) { return executor.Result{}, injected }, nil)) + require.ErrorIs(t, err, injected) + require.False(t, ready) +} + +func TestMaterializedViewLegacyRefreshDoesNotPublish(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + e := &refreshExecutor{t: t, op: op, mp: mp, state: State{Key: Key{7, 99}, Epoch: 2, Successful: 9, LastRun: "last-good", Definition: catalog.MVDefinition{FormatVersion: 1, Query: "select * from t", Sources: []catalog.MVSource{{Table: "t"}}}}} + require.ErrorContains(t, NewService(e).Refresh(context.Background(), Key{7, 99}, 0), "recreate") + require.Zero(t, e.dataWrites) + require.Zero(t, e.publications) + require.Equal(t, "last-good", e.state.LastRun) +} diff --git a/pkg/mv/task.go b/pkg/mv/task.go new file mode 100644 index 0000000000000..c152e38a58540 --- /dev/null +++ b/pkg/mv/task.go @@ -0,0 +1,259 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mv + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "time" + + "github.com/matrixorigin/matrixone/pkg/bootstrap/versions" + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/pb/task" + "github.com/matrixorigin/matrixone/pkg/pb/txn" + "github.com/matrixorigin/matrixone/pkg/taskservice" + "github.com/matrixorigin/matrixone/pkg/util/executor" + ie "github.com/matrixorigin/matrixone/pkg/util/internalExecutor" +) + +const CronExpression = "*/30 * * * * *" + +// TaskSpec is an internal, versioned task envelope, never a user SQL body. +type TaskSpec struct { + Version int + Reconcile bool + Key Key + Epoch uint64 + RunID string +} + +func CronMetadata() task.TaskMetadata { + data, _ := json.Marshal(TaskSpec{Version: 1, Reconcile: true}) + return task.TaskMetadata{ID: "materialized-view-reconcile-v1", Executor: task.TaskCode_MaterializedView, Context: data, Options: task.TaskOptions{Concurrency: 1}} +} + +// RegisterCron publishes the new task code only after its catalogs and every +// inventoried consumer are ready. Registering an executor on this CN alone +// cannot prevent an old CN from claiming a globally scheduled reconcile task. +// The CN's existing registration loop owns the deadline, retry and shutdown. +func (s *Service) RegisterCron(ctx context.Context, ts taskservice.TaskService) error { + if err := s.SQL.ExecTxn(ctx, func(tx executor.TxnExecutor) error { + ready, err := CatalogReady(tx) + if err != nil { + return err + } + if !ready { + return moerr.NewInvalidStateNoCtx("materialized view catalogs are not installed") + } + return versions.CheckCommonProtocolVersion(tx, defines.MORPCVersion119) + }, executor.Options{}.WithAccountID(catalog.System_Account)); err != nil { + return err + } + return ts.CreateCronTask(ctx, CronMetadata(), CronExpression) +} + +func runMetadata(key Key, epoch uint64, due int64) task.TaskMetadata { + digest := sha256.Sum256([]byte(fmt.Sprintf("%d:%d:%d:%d", key.Account, key.ID, epoch, due))) + id := hex.EncodeToString(digest[:]) + data, _ := json.Marshal(TaskSpec{Version: 1, Key: key, Epoch: epoch, RunID: id}) + // sys_async_task.task_metadata_id is VARCHAR(50). Keep 160 digest bits in + // the queue identity while the persisted refresh run uses the full digest. + return task.TaskMetadata{ID: "mv:" + id[:40], Executor: task.TaskCode_MaterializedView, Context: data, Options: task.TaskOptions{MaxRetryTimes: 2, RetryInterval: int64(5 * time.Second), Concurrency: 1}} +} + +func (s *Service) TaskExecutor(ts taskservice.TaskService, factory func() ie.InternalExecutor) taskservice.TaskExecutor { + return func(ctx context.Context, value task.Task) error { + ctx, cancel := context.WithTimeout(ctx, Timeout) + defer cancel() + async, ok := value.(*task.AsyncTask) + if !ok { + return moerr.NewInvalidInputNoCtx("invalid materialized view task") + } + var spec TaskSpec + if err := json.Unmarshal(async.Metadata.Context, &spec); err != nil { + return err + } + if spec.Version != 1 { + return moerr.NewNotSupportedNoCtx("materialized view task version") + } + if spec.Reconcile { + return s.reconcile(ctx, ts) + } + st, err := s.State(ctx, spec.Key) + if err != nil { + return err + } + if st.Epoch != spec.Epoch || st.Interval == 0 { + return nil + } + ctx = defines.AttachAccount(ctx, st.Account, st.Definition.OwnerUser, st.Definition.OwnerRole) + ctx = defines.WithMaterializedViewTask(ctx, defines.MaterializedViewTask{Account: st.Account, Table: st.ID, Epoch: spec.Epoch, RunID: spec.RunID}) + // The frontend rechecks owner existence, active role and source ACL. It never + // uses the privileged catalog executor for source permission admission. + opts := ie.NewOptsBuilder().AccountId(st.Account).UserId(st.Definition.OwnerUser).DefaultRoleId(st.Definition.OwnerRole).Username(st.Definition.OwnerName).Database(st.Database).Internal(false).Finish() + err = factory().Exec(ctx, "refresh materialized view "+Quote(st.Database)+"."+Quote(st.Name), opts) + if err != nil { + s.recordTaskFailure(ctx, spec) + } + return err + } +} + +// Admission failures (including revoked definer permissions) occur before +// Refresh can create a run. Record a sanitized terminal attempt and move the +// due time together so completed task deduplication cannot strand the policy. +func (s *Service) recordTaskFailure(ctx context.Context, spec TaskSpec) { + ctx, cancel := context.WithTimeout(context.WithoutCancel(ctx), 5*time.Second) + defer cancel() + _ = s.retryTxn(ctx, func(tx executor.TxnExecutor) error { + st, err := Load(tx, spec.Key) + if err != nil { + return err + } + if st.Epoch != spec.Epoch || st.LastRun == spec.RunID { + return nil + } + prior, err := loadRun(tx, spec.Key, spec.RunID) + if err != nil { + return err + } + if prior == nil { + sequence := st.Requested + 1 + if err := consume(tx, fmt.Sprintf("update mo_catalog.mo_materialized_views set requested_sequence=%d where account_id=%d and mv_id=%d", sequence, st.Account, st.ID)); err != nil { + return err + } + if err := consume(tx, fmt.Sprintf("insert into mo_catalog.mo_mv_refresh_runs(account_id,mv_id,run_id,sequence,epoch,status,started_at,finished_at,error_message) values(%d,%d,%s,%d,%d,'FAILED',current_timestamp(),current_timestamp(),'refresh admission failed')", st.Account, st.ID, literal(spec.RunID), sequence, st.Epoch)); err != nil { + return err + } + } + return consume(tx, fmt.Sprintf("update mo_catalog.mo_materialized_views set next_due=date_add(current_timestamp(),interval 60 second) where account_id=%d and mv_id=%d and interval_seconds>0", st.Account, st.ID)) + }, executor.Options{}.WithAccountID(spec.Key.Account).WithTxnIsolation(txn.TxnIsolation_SI).WithTxnMode(txn.TxnMode_Optimistic).WithWaitCommittedLogApplied()) +} +func (s *Service) reconcile(ctx context.Context, ts taskservice.TaskService) error { + ctx, cancel := context.WithTimeout(ctx, Timeout) + defer cancel() + opts := executor.Options{}.WithAccountID(catalog.System_Account) + // Recover a bounded, indexed page of interrupted attempts. + r, err := s.SQL.Exec(ctx, "select account_id,mv_id,run_id,epoch from mo_catalog.mo_mv_refresh_runs where status='RUNNING' and started_at0 and last_run<>%s and exists(select 1 from mo_catalog.mo_mv_refresh_runs where account_id=%d and mv_id=%d and run_id=%s and status='RUNNING' and started_at0 and next_due<=current_timestamp() and not exists (select 1 from mo_catalog.mo_mv_refresh_runs r where r.account_id=v.account_id and r.mv_id=v.mv_id and r.status='RUNNING') order by next_due,account_id,mv_id limit 128", opts) + if err != nil { + return err + } + var batch []task.TaskMetadata + r.ReadRows(func(n int, c []*vector.Vector) bool { + for i := 0; i < n; i++ { + batch = append(batch, runMetadata(Key{vector.GetFixedAtWithTypeCheck[uint32](c[0], i), vector.GetFixedAtWithTypeCheck[uint64](c[1], i)}, vector.GetFixedAtWithTypeCheck[uint64](c[2], i), vector.GetFixedAtWithTypeCheck[int64](c[3], i))) + } + return true + }) + r.Close() + if len(batch) > 0 { + if err := ts.CreateBatch(ctx, batch); err != nil { + return err + } + } + return s.cleanupHistory(ctx) +} + +// Visit 16 indexed maintenance intents. Each visits at most 128 terminal run +// IDs per retention rule and advances its cursor, including manual-only MVs. +func (s *Service) cleanupHistory(ctx context.Context) error { + opts := executor.Options{}.WithAccountID(catalog.System_Account) + r, err := s.SQL.Exec(ctx, "select account_id,mv_id from mo_catalog.mo_materialized_views where next_cleanup<=current_timestamp() order by next_cleanup,account_id,mv_id limit 16", opts) + if err != nil { + return err + } + var keys []Key + r.ReadRows(func(n int, c []*vector.Vector) bool { + for i := 0; i < n; i++ { + keys = append(keys, Key{vector.GetFixedAtWithTypeCheck[uint32](c[0], i), vector.GetFixedAtWithTypeCheck[uint64](c[1], i)}) + } + return true + }) + r.Close() + for _, key := range keys { + if ctx.Err() != nil { + return ctx.Err() + } + // Stable primary-key deletes are conditional on terminal status. The two + // pages may overlap; DELETE is idempotent and never removes an active run. + ids := map[string]struct{}{} + more := false + for _, condition := range []string{"order by sequence desc limit 128 offset 100", "and started_at'RUNNING' %s", key.Account, key.ID, condition), opts) + if err != nil { + return err + } + pageRows := 0 + r.ReadRows(func(n int, c []*vector.Vector) bool { + pageRows += n + for i := 0; i < n; i++ { + ids[c[0].GetStringAt(i)] = struct{}{} + } + return true + }) + r.Close() + more = more || pageRows >= 128 + } + for id := range ids { + r, err := s.SQL.Exec(ctx, fmt.Sprintf("delete from mo_catalog.mo_mv_refresh_runs where account_id=%d and mv_id=%d and run_id=%s and status<>'RUNNING'", key.Account, key.ID, literal(id)), opts) + if err != nil { + return err + } + r.Close() + } + next := "date_add(current_timestamp(),interval 1 hour)" + if more { + next = "current_timestamp()" + } + r, err := s.SQL.Exec(ctx, fmt.Sprintf("update mo_catalog.mo_materialized_views set next_cleanup=%s where account_id=%d and mv_id=%d", next, key.Account, key.ID), opts) + if err != nil { + return err + } + r.Close() + } + return nil +} diff --git a/pkg/mv/task_test.go b/pkg/mv/task_test.go new file mode 100644 index 0000000000000..354ef4e8ab3ea --- /dev/null +++ b/pkg/mv/task_test.go @@ -0,0 +1,547 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mv + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "strings" + "testing" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/common/mpool" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/pb/task" + "github.com/matrixorigin/matrixone/pkg/taskservice" + "github.com/matrixorigin/matrixone/pkg/util/executor" + ie "github.com/matrixorigin/matrixone/pkg/util/internalExecutor" + "github.com/stretchr/testify/require" +) + +type scheduledTasks struct { + taskservice.TaskService + batches [][]task.TaskMetadata + crons []task.TaskMetadata + exprs []string + cronErr error +} + +func (s *scheduledTasks) CreateCronTask(_ context.Context, metadata task.TaskMetadata, expression string) error { + s.crons = append(s.crons, metadata) + s.exprs = append(s.exprs, expression) + return s.cronErr +} + +func TestMaterializedViewCronAdmission(t *testing.T) { + for _, name := range []string{"ready", "missing catalogs", "partial catalogs", "catalog query failure", "old consumer", "protocol query failure", "empty inventory", "task store failure"} { + t.Run(name, func(t *testing.T) { + mp := mpool.MustNewZeroNoFixed() + t.Cleanup(func() { + defer mpool.DeleteMPool(mp) + require.Zero(t, mp.CurrNB()) + }) + injected := errors.New("cron admission dependency unavailable") + protocolQueries := 0 + sql := executor.NewMemExecutor(func(query string) (executor.Result, error) { + if query == CatalogReadinessSQL { + if name == "catalog query failure" { + return executor.Result{}, injected + } + count := int64(4) + if name == "missing catalogs" { + count = 0 + } else if name == "partial catalogs" { + count = 2 + } + r := executor.NewMemResult([]types.Type{types.T_int64.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []int64{count})) + return r.GetResult(), nil + } + require.Equal(t, "SELECT mo_ctl('cn', 'GetProtocolVersion', '')", query) + protocolQueries++ + if name == "protocol query failure" { + return executor.Result{}, injected + } + if name == "empty inventory" { + return executor.Result{}, nil + } + value := `{"result":"cn-new:119,tn-new:119"}` + if name == "old consumer" { + value = `{"result":"cn-new:119,cn-old:118,tn-new:119"}` + } + r := executor.NewMemResult([]types.Type{types.T_varchar.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendStringRows(r, 0, []string{value})) + return r.GetResult(), nil + }) + tasks := &scheduledTasks{} + if name == "task store failure" { + tasks.cronErr = injected + } + err := NewService(sql).RegisterCron(t.Context(), tasks) + if name == "ready" { + require.NoError(t, err) + } else { + require.Error(t, err) + } + if name == "ready" || name == "task store failure" { + require.Equal(t, []task.TaskMetadata{CronMetadata()}, tasks.crons) + require.Equal(t, []string{CronExpression}, tasks.exprs) + } else { + require.Empty(t, tasks.crons, "no new task code may be published before admission") + } + if strings.Contains(name, "catalog") { + require.Zero(t, protocolQueries) + } else { + require.Equal(t, 1, protocolQueries) + } + }) + } +} + +type scheduledRefreshExecutor struct { + ie.InternalExecutor + exec func(context.Context, string, ie.SessionOverrideOptions) error +} + +func (e scheduledRefreshExecutor) Exec(ctx context.Context, query string, opts ie.SessionOverrideOptions) error { + return e.exec(ctx, query, opts) +} + +// A queue entry cannot borrow a privileged session, revive an obsolete policy, +// or lose its terminal admission failure. Reuse the existing in-memory catalog +// fixture; no timer, task runner, or SQL service is needed for these boundaries. +func TestMaterializedViewTaskAdmission(t *testing.T) { + for _, name := range []string{"non-async task", "malformed envelope", "unknown version", "metadata failure", "retired definition", "obsolete epoch", "manual policy", "definer success", "definer failure", "already published failure"} { + t.Run(name, func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + state := State{Key: Key{7, 99}, Epoch: 2, Interval: 60, + Definition: catalog.MVDefinition{FormatVersion: 1, Database: "db", Query: "select * from t", OwnerUser: 11, OwnerRole: 12, OwnerName: "owner", Sources: []catalog.MVSource{{AccountID: 7, Database: "db", Table: "t"}}}} + if name == "manual policy" { + state.Interval = 0 + } + if name == "already published failure" { + state.LastRun = "queued-run" + } + fixture := &refreshExecutor{t: t, mp: mp, state: state} + metadataError := errors.New("metadata unavailable") + definerError := errors.New("definer permission revoked") + var writes []string + loads, calls := 0, 0 + sql := executor.NewMemExecutor(func(query string) (executor.Result, error) { + if strings.HasPrefix(query, "select database_name,") { + loads++ + if name == "metadata failure" { + return executor.Result{}, metadataError + } + if name == "retired definition" { + return executor.Result{}, nil + } + + return fixture.stateResult(), nil + } + if !strings.HasPrefix(query, "select ") { + writes = append(writes, query) + } + return executor.Result{}, nil + }) + svc := NewService(sql) + spec := TaskSpec{Version: 1, Key: state.Key, Epoch: 2, RunID: "queued-run"} + if name == "unknown version" { + spec.Version = 2 + } + if name == "obsolete epoch" { + spec.Epoch = 1 + } + payload, err := json.Marshal(spec) + require.NoError(t, err) + if name == "malformed envelope" { + payload = []byte("[") + } + var queued task.Task = &task.AsyncTask{Metadata: task.TaskMetadata{Context: payload}} + if name == "non-async task" { + queued = &task.CronTask{} + } + run := svc.TaskExecutor(nil, func() ie.InternalExecutor { + calls++ + return scheduledRefreshExecutor{exec: func(ctx context.Context, query string, opts ie.SessionOverrideOptions) error { + account, err := defines.GetAccountId(ctx) + require.NoError(t, err) + require.Equal(t, uint32(7), account) + require.Equal(t, uint32(11), defines.GetUserId(ctx)) + require.Equal(t, uint32(12), defines.GetRoleId(ctx)) + envelope, ok := defines.GetMaterializedViewTask(ctx) + require.True(t, ok) + require.Equal(t, defines.MaterializedViewTask{Account: 7, Table: 99, Epoch: 2, RunID: "queued-run"}, envelope) + require.Equal(t, "refresh materialized view `db`.`stored`", query) + require.Equal(t, ie.NewOptsBuilder().AccountId(7).UserId(11).DefaultRoleId(12).Username("owner").Database("db").Internal(false).Finish(), opts) + _, bounded := ctx.Deadline() + require.True(t, bounded) + if name != "definer success" { + return definerError + } + return nil + }} + }) + err = run(context.Background(), queued) + switch name { + case "non-async task", "malformed envelope", "unknown version": + require.Error(t, err) + require.Zero(t, loads) + switch name { + case "non-async task": + require.True(t, moerr.IsMoErrCode(err, moerr.ErrInvalidInput)) + case "malformed envelope": + var syntaxError *json.SyntaxError + require.ErrorAs(t, err, &syntaxError) + case "unknown version": + require.True(t, moerr.IsMoErrCode(err, moerr.ErrNotSupported)) + } + case "retired definition": + require.ErrorContains(t, err, "metadata does not exist") + require.Zero(t, calls) + require.Empty(t, writes) + case "metadata failure": + require.ErrorIs(t, err, metadataError) + case "definer failure": + require.ErrorIs(t, err, definerError) + require.Len(t, writes, 3) + require.Contains(t, writes[0], "requested_sequence=1") + require.Contains(t, writes[1], "'FAILED'") + require.Contains(t, writes[1], "'refresh admission failed'") + require.NotContains(t, writes[1], definerError.Error(), "persist only sanitized failure diagnostics") + require.Contains(t, writes[2], "next_due=date_add") + case "already published failure": + require.ErrorIs(t, err, definerError) + default: + require.NoError(t, err) + } + if name != "definer failure" { + require.Empty(t, writes) + } + if name == "definer success" || name == "definer failure" || name == "already published failure" { + require.Equal(t, 1, calls) + } else { + require.Zero(t, calls) + } + }) + } +} + +func (s *scheduledTasks) CreateBatch(_ context.Context, batch []task.TaskMetadata) error { + s.batches = append(s.batches, append([]task.TaskMetadata(nil), batch...)) + return nil +} +func TestMaterializedViewReconcileIdentity(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + sql := executor.NewMemExecutor(func(query string) (executor.Result, error) { + if strings.HasPrefix(query, "select account_id,mv_id,epoch,") { + require.Contains(t, query, "next_due<=current_timestamp()") + require.Contains(t, query, "not exists") + require.Contains(t, query, "limit 128") + r := executor.NewMemResult([]types.Type{types.T_uint32.ToType(), types.T_uint64.ToType(), types.T_uint64.ToType(), types.T_int64.ToType()}, mp) + r.NewBatchWithRowCount(2) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint32{7, 8})) + require.NoError(t, executor.AppendFixedRows(r, 1, []uint64{99, 99})) + require.NoError(t, executor.AppendFixedRows(r, 2, []uint64{2, 2})) + require.NoError(t, executor.AppendFixedRows(r, 3, []int64{123, 123})) + return r.GetResult(), nil + } + require.True(t, strings.HasPrefix(query, "select account_id,mv_id,run_id,") || strings.HasPrefix(query, "select account_id,mv_id from")) + return executor.Result{}, nil + }) + service := NewService(sql) + tasks := &scheduledTasks{} + require.NoError(t, service.reconcile(context.Background(), tasks)) + require.NoError(t, service.reconcile(context.Background(), tasks)) + require.Len(t, tasks.batches, 2) + require.Len(t, tasks.batches[0], 2) + require.Equal(t, tasks.batches[0], tasks.batches[1]) + require.NotEqual(t, tasks.batches[0][0].ID, tasks.batches[0][1].ID) +} + +func TestMaterializedViewInterruptedTaskRecovery(t *testing.T) { + for _, phase := range []string{"success", "scan failure", "reschedule failure", "abort failure", "cancelled page"} { + t.Run(phase, func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + failure := errors.New("interrupted task recovery unavailable") + var writes []string + sql := executor.NewMemExecutor(func(query string) (executor.Result, error) { + if strings.HasPrefix(query, "select account_id,mv_id,run_id,") { + require.Contains(t, query, "status='RUNNING'") + require.Contains(t, query, "interval 360 second") + require.Contains(t, query, "limit 128") + if phase == "scan failure" { + return executor.Result{}, failure + } + r := executor.NewMemResult([]types.Type{types.T_uint32.ToType(), types.T_uint64.ToType(), types.T_varchar.ToType(), types.T_uint64.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint32{7})) + require.NoError(t, executor.AppendFixedRows(r, 1, []uint64{99})) + require.NoError(t, executor.AppendStringRows(r, 2, []string{"interrupted-run"})) + require.NoError(t, executor.AppendFixedRows(r, 3, []uint64{2})) + if phase == "cancelled page" { + cancel() + } + return r.GetResult(), nil + } + if strings.HasPrefix(query, "update ") { + writes = append(writes, query) + require.Contains(t, query, "account_id=7 and mv_id=99") + require.Contains(t, query, "run_id='interrupted-run'") + require.Contains(t, query, "status='RUNNING'") + if strings.Contains(query, "next_due=") { + require.Contains(t, query, "epoch=2") + require.Contains(t, query, "last_run<>'interrupted-run'") + if phase == "reschedule failure" { + return executor.Result{}, failure + } + } else { + require.Contains(t, query, "status='ABORTED'") + if phase == "abort failure" { + return executor.Result{}, failure + } + } + } + return executor.Result{}, nil + }) + tasks := &scheduledTasks{} + err := NewService(sql).reconcile(ctx, tasks) + switch phase { + case "success": + require.NoError(t, err) + require.Len(t, writes, 2) + case "cancelled page": + require.ErrorIs(t, err, context.Canceled) + require.Empty(t, writes) + default: + require.ErrorIs(t, err, failure) + } + require.Empty(t, tasks.batches, "recovery failure cannot enqueue a replacement refresh") + }) + } +} + +func TestMaterializedViewHistoryRetention(t *testing.T) { + for _, phase := range []string{"overlapping pages", "key scan failure", "count page failure", "age page failure", "delete failure", "cursor failure", "cancelled page"} { + t.Run(phase, func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + failure := errors.New("history maintenance unavailable") + pages, deletes, advances := 0, 0, 0 + sql := executor.NewMemExecutor(func(query string) (executor.Result, error) { + switch { + case strings.HasPrefix(query, "select account_id,mv_id from"): + require.Contains(t, query, "limit 16") + if phase == "key scan failure" { + return executor.Result{}, failure + } + r := executor.NewMemResult([]types.Type{types.T_uint32.ToType(), types.T_uint64.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint32{7})) + require.NoError(t, executor.AppendFixedRows(r, 1, []uint64{99})) + if phase == "cancelled page" { + cancel() + } + return r.GetResult(), nil + case strings.HasPrefix(query, "select run_id"): + pages++ + require.Contains(t, query, "account_id=7 and mv_id=99") + require.Contains(t, query, "status<>'RUNNING'") + require.Contains(t, query, "limit 128") + if pages == 1 { + require.Contains(t, query, "offset 100") + if phase == "count page failure" { + return executor.Result{}, failure + } + } else { + require.Contains(t, query, "interval 7 day") + if phase == "age page failure" { + return executor.Result{}, failure + } + } + r := executor.NewMemResult([]types.Type{types.T_varchar.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendStringRows(r, 0, []string{"old-terminal-run"})) + return r.GetResult(), nil + case strings.HasPrefix(query, "delete from"): + deletes++ + require.Contains(t, query, "account_id=7 and mv_id=99") + require.Contains(t, query, "run_id='old-terminal-run' and status<>'RUNNING'") + if phase == "delete failure" { + return executor.Result{}, failure + } + case strings.HasPrefix(query, "update "): + advances++ + require.Contains(t, query, "account_id=7 and mv_id=99") + require.Contains(t, query, "next_cleanup=date_add") + if phase == "cursor failure" { + return executor.Result{}, failure + } + default: + t.Fatalf("unexpected maintenance statement: %s", query) + } + return executor.Result{}, nil + }) + err := NewService(sql).cleanupHistory(ctx) + switch phase { + case "overlapping pages": + require.NoError(t, err) + require.Equal(t, 2, pages) + require.Equal(t, 1, deletes, "overlapping retention pages delete each terminal run once") + require.Equal(t, 1, advances) + case "cancelled page": + require.ErrorIs(t, err, context.Canceled) + require.Zero(t, pages) + default: + require.ErrorIs(t, err, failure) + } + if phase != "overlapping pages" && phase != "cursor failure" { + require.Zero(t, advances, "a failed maintenance page must not advance its cursor") + } + }) + } +} + +func TestMaterializedViewHistoryBacklogConverges(t *testing.T) { + for _, tc := range []struct { + name string + pages [2]int + batches bool + cancel bool + more bool + }{ + {"both short", [2]int{127, 127}, false, false, false}, + {"count full age short", [2]int{128, 1}, false, false, true}, + {"age full count short", [2]int{1, 128}, false, false, true}, + {"full overlapping pages", [2]int{128, 128}, false, false, true}, + {"full across batches", [2]int{128, 0}, true, false, true}, + {"cancel after history page", [2]int{128, 0}, false, true, true}, + } { + t.Run(tc.name, func(t *testing.T) { + mp := mpool.MustNewZero() + t.Cleanup(func() { require.Zero(t, mp.CurrNB()) }) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + invocation, pages := 0, 0 + deleted := map[string]bool{} + var cursors []string + sql := executor.NewMemExecutor(func(q string) (executor.Result, error) { + if err := ctx.Err(); err != nil { + return executor.Result{}, err + } + switch { + case strings.HasPrefix(q, "select account_id,mv_id,run_id,epoch"): + return executor.Result{}, nil + case strings.HasPrefix(q, "select account_id,mv_id,epoch,"): + r := executor.NewMemResult([]types.Type{types.T_uint32.ToType(), types.T_uint64.ToType(), types.T_uint64.ToType(), types.T_int64.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint32{7})) + require.NoError(t, executor.AppendFixedRows(r, 1, []uint64{999})) + require.NoError(t, executor.AppendFixedRows(r, 2, []uint64{2})) + require.NoError(t, executor.AppendFixedRows(r, 3, []int64{1})) + return r.GetResult(), nil + case strings.HasPrefix(q, "select account_id,mv_id from"): + require.Contains(t, q, "order by next_cleanup,account_id,mv_id limit 16") + r := executor.NewMemResult([]types.Type{types.T_uint32.ToType(), types.T_uint64.ToType()}, mp) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint32{7})) + require.NoError(t, executor.AppendFixedRows(r, 1, []uint64{99})) + return r.GetResult(), nil + case strings.HasPrefix(q, "select run_id"): + require.Contains(t, q, "status<>'RUNNING'") + require.Contains(t, q, "limit 128") + page := 0 + if !strings.Contains(q, "offset 100") { + page = 1 + } + pages++ + n := tc.pages[page] + if invocation > 0 { + n = 0 + } // Independent drained-store response. + r := executor.NewMemResult([]types.Type{types.T_varchar.ToType()}, mp) + for start := 0; start < n; { + end := n + if tc.batches && end-start > 64 { + end = start + 64 + } + values := make([]string, end-start) + for i := range values { + values[i] = fmt.Sprintf("terminal-%03d", start+i) + } + r.NewBatchWithRowCount(len(values)) + require.NoError(t, executor.AppendStringRows(r, 0, values)) + start = end + } + if tc.cancel { + cancel() + } + return r.GetResult(), nil + case strings.HasPrefix(q, "delete from"): + require.Contains(t, q, "account_id=7 and mv_id=99") + require.Contains(t, q, "and status<>'RUNNING'") + require.False(t, deleted[q], "overlapping pages must delete each terminal ID once") + deleted[q] = true + case strings.HasPrefix(q, "update "): + cursors = append(cursors, q) + default: + t.Fatalf("unexpected maintenance SQL: %s", q) + } + return executor.Result{}, nil + }) + svc := NewService(sql) + tasks := &scheduledTasks{} + err := svc.reconcile(ctx, tasks) + require.Len(t, tasks.batches, 1, "maintenance backlog must not suppress task publication") + require.Len(t, tasks.batches[0], 1) + var spec TaskSpec + require.NoError(t, json.Unmarshal(tasks.batches[0][0].Context, &spec)) + require.Equal(t, Key{7, 999}, spec.Key) + require.Equal(t, uint64(2), spec.Epoch) + if tc.cancel { + require.ErrorIs(t, err, context.Canceled) + require.Empty(t, cursors) + return + } + require.NoError(t, err) + require.Equal(t, 2, pages) + require.Len(t, deleted, max(tc.pages[0], tc.pages[1])) + require.Len(t, cursors, 1) + if tc.more { + require.Contains(t, cursors[0], "next_cleanup=current_timestamp() ") + } else { + require.Contains(t, cursors[0], "next_cleanup=date_add(current_timestamp(),interval 1 hour)") + } + invocation++ + require.NoError(t, svc.reconcile(ctx, tasks)) + require.Len(t, tasks.batches, 2) + require.Len(t, cursors, 2) + require.Contains(t, cursors[1], "next_cleanup=date_add(current_timestamp(),interval 1 hour)") + }) + } +} diff --git a/pkg/pb/task/task.pb.go b/pkg/pb/task/task.pb.go index 9a1bab38ae2e8..d7fb0e0ddaea1 100644 --- a/pkg/pb/task/task.pb.go +++ b/pkg/pb/task/task.pb.go @@ -126,6 +126,8 @@ const ( TaskCode_InitCdcLosslessStart TaskCode = 15 // CDC source patterns with lossless identifier encoding. TaskCode_InitCdcSourcePatternV1 TaskCode = 16 + // Native materialized view reconciliation and fenced refresh tasks. + TaskCode_MaterializedView TaskCode = 17 ) var TaskCode_name = map[int32]string{ @@ -144,6 +146,7 @@ var TaskCode_name = map[int32]string{ 14: "InitCdcStableEpoch", 15: "InitCdcLosslessStart", 16: "InitCdcSourcePatternV1", + 17: "MaterializedView", } var TaskCode_value = map[string]int32{ @@ -162,6 +165,7 @@ var TaskCode_value = map[string]int32{ "InitCdcStableEpoch": 14, "InitCdcLosslessStart": 15, "InitCdcSourcePatternV1": 16, + "MaterializedView": 17, } func (x TaskCode) String() string { @@ -957,11 +961,11 @@ func (m *Account) GetName() string { } type CreateCdcDetails struct { - // cdc task uuid + //cdc task uuid TaskId string `protobuf:"bytes,1,opt,name=TaskId,proto3" json:"TaskId,omitempty"` - // cdc task name in CreateCdc + //cdc task name in CreateCdc TaskName string `protobuf:"bytes,2,opt,name=TaskName,proto3" json:"TaskName,omitempty"` - // cdc source account + //cdc source account Accounts []*Account `protobuf:"bytes,3,rep,name=Accounts,proto3" json:"Accounts,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -1182,7 +1186,6 @@ type Details struct { Username string `protobuf:"bytes,4,opt,name=Username,proto3" json:"Username,omitempty"` Error string `protobuf:"bytes,5,opt,name=Error,proto3" json:"Error,omitempty"` // Types that are valid to be assigned to Details: - // // *Details_CreateCdc // *Details_ISCP // *Details_Publication @@ -1485,111 +1488,112 @@ func init() { func init() { proto.RegisterFile("task.proto", fileDescriptor_ce5d8dd45b4a91ff) } var fileDescriptor_ce5d8dd45b4a91ff = []byte{ - // 1664 bytes of a gzipped FileDescriptorProto + // 1678 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4f, 0x93, 0xe3, 0x46, - 0x15, 0xb7, 0x6c, 0xd9, 0x96, 0x5b, 0xb6, 0xb7, 0xe9, 0xdd, 0xda, 0xa8, 0x4c, 0x98, 0x75, 0xa9, - 0x02, 0x19, 0xa6, 0x2a, 0x33, 0x64, 0x08, 0x14, 0x49, 0x51, 0x54, 0x66, 0xec, 0x21, 0xe3, 0xcd, - 0x4c, 0x76, 0xd2, 0x9e, 0xe1, 0xc0, 0xad, 0x2d, 0xbd, 0x78, 0xc5, 0xd8, 0x2d, 0x47, 0x6a, 0x85, - 0xf1, 0x57, 0xd8, 0x13, 0x37, 0x2e, 0x6c, 0x15, 0x9f, 0x80, 0xaf, 0xc0, 0x35, 0xc7, 0x9c, 0x38, - 0x51, 0x10, 0x16, 0x3e, 0x02, 0x57, 0xaa, 0xa8, 0xd7, 0x2d, 0xc9, 0xb2, 0xb7, 0xa0, 0xb2, 0xb0, - 0x37, 0xbd, 0xdf, 0xfb, 0xd3, 0xaf, 0xdf, 0xeb, 0xf7, 0xeb, 0x16, 0x21, 0x4a, 0xa4, 0xb7, 0x87, - 0xab, 0x24, 0x56, 0x31, 0xb3, 0xf1, 0x7b, 0xf0, 0xce, 0x3c, 0x52, 0x4f, 0xb3, 0xd9, 0x61, 0x10, - 0x2f, 0x8f, 0xe6, 0xf1, 0x3c, 0x3e, 0xd2, 0xca, 0x59, 0xf6, 0x99, 0x96, 0xb4, 0xa0, 0xbf, 0x8c, - 0xd3, 0xe0, 0xd1, 0x3c, 0x8e, 0xe7, 0x0b, 0xd8, 0x58, 0xa9, 0x68, 0x09, 0xa9, 0x12, 0xcb, 0x55, - 0x6e, 0xd0, 0x5f, 0x82, 0x12, 0xa1, 0x50, 0xc2, 0xc8, 0xfe, 0x6f, 0x2d, 0xd2, 0xbd, 0x16, 0xe9, - 0xed, 0x65, 0x0e, 0xb3, 0x3e, 0xa9, 0x4f, 0xc6, 0x9e, 0x35, 0xb4, 0xf6, 0x3b, 0xbc, 0x3e, 0x19, - 0xb3, 0x03, 0xe2, 0x9c, 0xdd, 0x41, 0x90, 0xa9, 0x38, 0xf1, 0xea, 0x43, 0x6b, 0xbf, 0x7f, 0xdc, - 0x3f, 0xd4, 0x59, 0xa2, 0xd7, 0x28, 0x0e, 0x81, 0x97, 0x7a, 0xe6, 0x91, 0xf6, 0x28, 0x96, 0x0a, - 0xee, 0x94, 0xd7, 0x18, 0x5a, 0xfb, 0x5d, 0x5e, 0x88, 0xec, 0x5d, 0xd2, 0x7e, 0xb2, 0x52, 0x51, - 0x2c, 0x53, 0xcf, 0x1e, 0x5a, 0xfb, 0xee, 0xf1, 0xb7, 0x36, 0x41, 0x72, 0xc5, 0xa9, 0xfd, 0xe5, - 0x5f, 0x1e, 0xd5, 0x78, 0x61, 0xe7, 0xff, 0xb9, 0x41, 0xfa, 0xd3, 0x4f, 0x2f, 0xcc, 0x32, 0x26, - 0xca, 0x43, 0xd2, 0x42, 0x71, 0x12, 0xea, 0xfc, 0x6c, 0x9e, 0x4b, 0x6c, 0x40, 0x1c, 0xfc, 0xfa, - 0x44, 0x2c, 0x41, 0xe7, 0xd8, 0xe1, 0xa5, 0xcc, 0xde, 0x24, 0x9d, 0x93, 0x20, 0x88, 0x33, 0xa9, - 0x26, 0xa1, 0xce, 0xaa, 0xc7, 0x37, 0x00, 0xf3, 0x49, 0x77, 0x2c, 0x94, 0x98, 0x89, 0x14, 0xb4, - 0xb7, 0xad, 0xbd, 0xb7, 0x30, 0xdc, 0xd5, 0xf4, 0xd3, 0x8b, 0xd3, 0x38, 0x5c, 0x7b, 0x4d, 0xad, - 0x2e, 0x44, 0xf6, 0x16, 0xe9, 0x7d, 0x24, 0x14, 0x8c, 0x62, 0x19, 0x46, 0x98, 0xb4, 0xd7, 0xd2, - 0xfa, 0x6d, 0x90, 0xed, 0x11, 0xc2, 0x41, 0x25, 0xeb, 0x8b, 0x68, 0x19, 0x29, 0xaf, 0xad, 0x53, - 0xa8, 0x20, 0xec, 0x7b, 0xa4, 0x7f, 0x1d, 0x2d, 0x21, 0xce, 0xd4, 0x14, 0x82, 0x58, 0x86, 0xa9, - 0xe7, 0x68, 0x9b, 0x1d, 0x54, 0x57, 0x37, 0x01, 0x81, 0x8d, 0xe8, 0x98, 0x3c, 0x72, 0x11, 0xf3, - 0xc8, 0x3f, 0x6f, 0x52, 0x48, 0x26, 0xa1, 0x47, 0x74, 0x80, 0x6d, 0xb0, 0x62, 0xc5, 0xe3, 0x05, - 0x4c, 0x42, 0xcf, 0xdd, 0xb2, 0x32, 0x20, 0x1b, 0x12, 0xf7, 0x3a, 0x89, 0xe6, 0x73, 0x48, 0xae, - 0xd7, 0x2b, 0xf0, 0xba, 0x7a, 0xa5, 0x2a, 0x84, 0x16, 0xd3, 0xe0, 0x29, 0x84, 0xd9, 0x02, 0xc2, - 0x13, 0xe5, 0xf5, 0x86, 0xd6, 0x7e, 0x83, 0x57, 0x21, 0xac, 0x6a, 0xee, 0x30, 0xc2, 0x3a, 0x7b, - 0x7d, 0xdd, 0xad, 0x2d, 0xcc, 0xff, 0x63, 0x9d, 0xb8, 0x95, 0xee, 0x63, 0x76, 0x97, 0xe2, 0x4e, - 0x97, 0x05, 0xf7, 0x9d, 0xea, 0x16, 0xf7, 0xf8, 0x36, 0x88, 0x56, 0x5a, 0x9a, 0x48, 0x05, 0xc9, - 0x17, 0x62, 0xa1, 0xdb, 0xdd, 0xe0, 0xdb, 0x20, 0x5a, 0x8d, 0x61, 0x21, 0xd6, 0xe3, 0x2c, 0x11, - 0xba, 0x2f, 0x0d, 0x63, 0xb5, 0x05, 0xe2, 0x3e, 0x46, 0xb1, 0x0c, 0xb2, 0x24, 0x01, 0x19, 0xac, - 0x75, 0xeb, 0x7b, 0xbc, 0x0a, 0xb1, 0x1f, 0x91, 0xd6, 0x85, 0x98, 0xc1, 0x22, 0xf5, 0x9a, 0xc3, - 0xc6, 0xbe, 0x7b, 0xfc, 0x9d, 0x97, 0x0e, 0xed, 0xa1, 0xd1, 0x9f, 0x49, 0x95, 0xac, 0x79, 0x6e, - 0x8c, 0x23, 0xc3, 0x21, 0x8d, 0xb3, 0x24, 0x00, 0x7d, 0x22, 0xdc, 0x62, 0x64, 0x0a, 0x94, 0x97, - 0xfa, 0xc1, 0xfb, 0xc4, 0xad, 0x84, 0x60, 0x94, 0x34, 0x6e, 0x61, 0x9d, 0x8f, 0x1f, 0x7e, 0xb2, - 0x07, 0xa4, 0xf9, 0x85, 0x58, 0x64, 0xc5, 0xc1, 0x36, 0xc2, 0x07, 0xf5, 0x9f, 0x58, 0xfe, 0x7b, - 0x9b, 0x65, 0xd0, 0x6f, 0x74, 0x75, 0x93, 0x8f, 0x05, 0x7e, 0xe2, 0xac, 0x5c, 0xc2, 0x32, 0x4e, - 0xd6, 0xda, 0xd1, 0xe6, 0xb9, 0xe4, 0x7f, 0x4c, 0x7a, 0x66, 0x5e, 0x81, 0x43, 0x9a, 0x2d, 0x14, - 0x7b, 0x8b, 0xd8, 0x38, 0xc6, 0xda, 0xb7, 0x7f, 0x4c, 0xcb, 0x4c, 0xb3, 0x85, 0xd2, 0xe3, 0xad, - 0xb5, 0x98, 0xc6, 0x59, 0x92, 0xe4, 0x1c, 0xd0, 0xe1, 0x46, 0xf0, 0xff, 0x59, 0x27, 0x9d, 0x93, - 0x74, 0x2d, 0x03, 0x2c, 0x49, 0x85, 0x3a, 0x6c, 0x4d, 0x1d, 0xef, 0x11, 0xa7, 0xa0, 0x15, 0xed, - 0xe6, 0x1e, 0xb3, 0x4d, 0x01, 0x0b, 0x4d, 0x3e, 0xf6, 0xa5, 0x25, 0x1e, 0x9e, 0x2b, 0x91, 0x80, - 0x54, 0x7a, 0xb8, 0xc7, 0xba, 0x77, 0x1d, 0xbe, 0x85, 0xb1, 0x7d, 0xd2, 0x9a, 0x2a, 0xa1, 0x32, - 0xc3, 0x26, 0x65, 0xd6, 0xa8, 0x35, 0x38, 0xcf, 0xf5, 0x38, 0x7c, 0x88, 0xf2, 0x4c, 0x4a, 0x48, - 0xf2, 0xf9, 0xad, 0x20, 0x7a, 0x5f, 0xab, 0x38, 0x78, 0xaa, 0x1b, 0xd5, 0xe3, 0x46, 0xc0, 0x03, - 0x74, 0x21, 0x52, 0x75, 0x0e, 0x22, 0x51, 0x33, 0x10, 0x66, 0x6a, 0x1b, 0x7c, 0x1b, 0x44, 0xda, - 0xd1, 0xb3, 0x03, 0x27, 0x4a, 0x8f, 0x6c, 0x83, 0x97, 0xb2, 0x39, 0x5c, 0xcb, 0xd5, 0x02, 0x94, - 0x1e, 0x92, 0x8e, 0x19, 0x92, 0x0a, 0xc4, 0xde, 0xdf, 0x69, 0x84, 0x1e, 0x5a, 0xf7, 0xf8, 0xbe, - 0xd9, 0xca, 0x96, 0x8a, 0x6f, 0x5b, 0xfa, 0xff, 0xb0, 0x70, 0xe5, 0x58, 0xbe, 0xc6, 0xaa, 0x0f, - 0x4c, 0xc4, 0xb3, 0xbb, 0x55, 0x92, 0x57, 0xbc, 0x94, 0x51, 0xf7, 0x09, 0xdc, 0x29, 0x9c, 0x40, - 0x5d, 0xef, 0x06, 0x2f, 0xe5, 0xca, 0xa8, 0x9b, 0xa9, 0x6d, 0x6e, 0x8d, 0xba, 0x19, 0xda, 0x6a, - 0x9d, 0x5a, 0x3b, 0x75, 0x1a, 0x10, 0xe7, 0x66, 0x15, 0x1a, 0x9d, 0x29, 0x72, 0x29, 0xfb, 0xef, - 0x90, 0x76, 0xce, 0xd4, 0x7a, 0x93, 0x61, 0xb9, 0xc9, 0x90, 0x31, 0x62, 0x57, 0xd8, 0x5e, 0x7f, - 0xfb, 0x9f, 0x13, 0x6a, 0xc2, 0x8e, 0xc2, 0x60, 0x0c, 0x4a, 0x44, 0x8b, 0x74, 0xe7, 0xc6, 0xe8, - 0x7c, 0xa3, 0x1b, 0xe3, 0xfb, 0xc4, 0xc9, 0x97, 0x4d, 0xbd, 0x86, 0x9e, 0xfb, 0x9e, 0x29, 0x60, - 0x8e, 0xf2, 0x52, 0xed, 0x33, 0x42, 0x39, 0x28, 0x90, 0xc8, 0x05, 0xf9, 0x92, 0xfe, 0x09, 0x71, - 0x27, 0xd3, 0xd1, 0xd5, 0xff, 0x91, 0x81, 0x7f, 0x4e, 0xd8, 0x55, 0x36, 0x5b, 0x44, 0x81, 0xa8, - 0x04, 0xfe, 0x9f, 0x22, 0xfd, 0xa9, 0x4e, 0xda, 0x85, 0xff, 0x90, 0xb8, 0x63, 0x48, 0x83, 0x24, - 0xd2, 0xd4, 0x95, 0x07, 0xa9, 0x42, 0xd5, 0xbb, 0x72, 0xac, 0x43, 0x55, 0xee, 0xca, 0x31, 0xde, - 0x3f, 0xb9, 0x90, 0x9f, 0x90, 0xb2, 0x3b, 0xd8, 0xc4, 0x14, 0x12, 0xb9, 0xb9, 0x41, 0x4b, 0x79, - 0x43, 0x1c, 0xcd, 0x0a, 0x71, 0xb0, 0x1f, 0x93, 0x4e, 0xd9, 0x2b, 0x7d, 0xc7, 0xb8, 0xc7, 0x0f, - 0x4d, 0x91, 0x77, 0x5b, 0x78, 0x5e, 0xe3, 0x1b, 0x53, 0xf6, 0x36, 0xb1, 0xb1, 0xb8, 0xfa, 0xd2, - 0x29, 0x1f, 0x11, 0x95, 0x72, 0x9f, 0xd7, 0xb8, 0x36, 0x60, 0x3f, 0x25, 0x6e, 0xa5, 0x84, 0xfa, - 0x06, 0x72, 0x8f, 0x3d, 0x63, 0xff, 0x72, 0x6d, 0xcf, 0x6b, 0xbc, 0x6a, 0x7e, 0xda, 0x29, 0xab, - 0xf6, 0xd8, 0x76, 0x08, 0x75, 0x1f, 0xdb, 0x8e, 0x4b, 0xbb, 0xbc, 0x33, 0x8a, 0xa5, 0x84, 0x40, - 0xc5, 0x89, 0xff, 0x2f, 0x9b, 0x90, 0xb1, 0x80, 0xe5, 0x6b, 0x1d, 0xc2, 0xad, 0xfa, 0x37, 0xfe, - 0x4b, 0xfd, 0xed, 0xed, 0xfa, 0x1f, 0x98, 0x13, 0xa0, 0x2f, 0xec, 0xe6, 0xee, 0x1b, 0x0d, 0x51, - 0x5e, 0xea, 0x77, 0x08, 0xb1, 0xf5, 0x12, 0x21, 0xfe, 0xc0, 0xe8, 0x73, 0x7a, 0x6d, 0xff, 0x07, - 0x7a, 0xad, 0xd8, 0xb0, 0xc7, 0xbb, 0x64, 0xe9, 0xe8, 0x0d, 0x0f, 0x0e, 0xcd, 0x5b, 0xf4, 0xb0, - 0x78, 0x8b, 0x1e, 0x5e, 0x17, 0x6f, 0xd1, 0x53, 0x07, 0x37, 0xfe, 0x9b, 0xbf, 0x3e, 0xb2, 0x76, - 0x29, 0xf5, 0xed, 0xb2, 0xf0, 0x9a, 0x32, 0xcb, 0xd1, 0xcb, 0x41, 0x5e, 0x1e, 0xe6, 0x0f, 0x2b, - 0x9c, 0x42, 0x5e, 0x61, 0xbd, 0x0d, 0xf3, 0x7c, 0x58, 0x61, 0x1e, 0xf7, 0x55, 0x22, 0x14, 0x5e, - 0xec, 0x03, 0xd2, 0x3c, 0x93, 0xc8, 0xee, 0xdd, 0x57, 0x70, 0x37, 0x2e, 0xec, 0x67, 0xa4, 0x8d, - 0x3b, 0xe7, 0x99, 0xcc, 0xcf, 0xf2, 0x37, 0xf3, 0x2e, 0x9c, 0x0e, 0xfe, 0x60, 0x55, 0xfb, 0xc4, - 0xdc, 0xfc, 0x6d, 0x08, 0x21, 0xad, 0xa1, 0x80, 0xcd, 0x8c, 0xe4, 0x9c, 0x5a, 0xac, 0x47, 0x3a, - 0xe5, 0xad, 0x43, 0xeb, 0x8c, 0x90, 0xd6, 0x95, 0xc8, 0x52, 0x08, 0x69, 0x83, 0x75, 0xf2, 0xd1, - 0xa4, 0x36, 0xeb, 0x12, 0x67, 0x24, 0x64, 0x00, 0x0b, 0x08, 0x69, 0x93, 0xdd, 0x27, 0xf7, 0xf0, - 0xa6, 0x59, 0x02, 0x87, 0xcf, 0x33, 0x48, 0xd1, 0xb3, 0xc5, 0x18, 0xe9, 0x6b, 0xcf, 0x0d, 0xd6, - 0x46, 0x43, 0xe3, 0xb6, 0x01, 0x1d, 0xf6, 0x00, 0x49, 0x31, 0x55, 0x22, 0x51, 0x1b, 0xb4, 0x73, - 0xf0, 0x75, 0xdd, 0x1c, 0x52, 0xfd, 0x9a, 0xe8, 0x12, 0xe7, 0x1a, 0x52, 0xf5, 0x44, 0x2e, 0xd6, - 0xb4, 0xc6, 0xfa, 0x84, 0x4c, 0xd7, 0xa9, 0x82, 0xe5, 0x44, 0x46, 0x8a, 0x5a, 0xb8, 0xd2, 0x25, - 0xa8, 0x24, 0x0a, 0x2e, 0xe2, 0xf9, 0x25, 0x24, 0x73, 0xa0, 0x75, 0xf6, 0x90, 0x30, 0x83, 0x4d, - 0x55, 0x9c, 0x88, 0x39, 0xdc, 0xa4, 0x62, 0x0e, 0xb4, 0xc1, 0xee, 0x11, 0x57, 0x9b, 0x3c, 0x99, - 0xfd, 0x0a, 0x02, 0x45, 0x9b, 0xb8, 0x79, 0x0c, 0x33, 0x0a, 0x03, 0xda, 0x66, 0x94, 0x74, 0x2f, - 0x9f, 0x5c, 0x8b, 0xd9, 0x02, 0xb0, 0x4e, 0x29, 0x75, 0x10, 0x41, 0x7e, 0x28, 0x7e, 0x59, 0x68, - 0x87, 0x7d, 0x9b, 0xbc, 0x31, 0x91, 0x21, 0xdc, 0x99, 0xb6, 0x62, 0x8a, 0xa5, 0x92, 0xb0, 0x37, - 0xc8, 0xfd, 0x0a, 0x2f, 0x94, 0x0a, 0x17, 0x97, 0xc9, 0x7f, 0x4e, 0x68, 0x17, 0xad, 0xf0, 0x8f, - 0xe1, 0x34, 0x11, 0x32, 0x78, 0x7a, 0x11, 0x49, 0x10, 0x73, 0xf8, 0x68, 0x44, 0x7b, 0x98, 0x75, - 0x9e, 0xcc, 0x54, 0x61, 0x16, 0xfa, 0x75, 0x41, 0xfb, 0xcc, 0x23, 0x0f, 0x72, 0xfc, 0x22, 0x4e, - 0xd3, 0x05, 0xa4, 0xe9, 0x14, 0xeb, 0x45, 0xef, 0xb1, 0x01, 0x79, 0x58, 0x78, 0xe8, 0x97, 0xdd, - 0x95, 0x50, 0x0a, 0x12, 0xf9, 0x8b, 0x77, 0x29, 0xf5, 0x6d, 0xc7, 0xa6, 0xb6, 0x6f, 0x3b, 0x2d, - 0xda, 0x3a, 0x60, 0x25, 0x15, 0x7d, 0x2c, 0x3e, 0xbb, 0x15, 0xd3, 0x48, 0xde, 0x1e, 0x7c, 0x17, - 0x7f, 0x34, 0x8a, 0x77, 0x9b, 0xce, 0x30, 0x0b, 0x02, 0x48, 0x53, 0x5a, 0xc3, 0xb6, 0xff, 0x5c, - 0x44, 0xd8, 0x5d, 0xeb, 0xe0, 0x77, 0xd6, 0x86, 0x2e, 0xd8, 0x9b, 0xa4, 0x7d, 0x23, 0x6f, 0x65, - 0xfc, 0x6b, 0x49, 0x6b, 0x83, 0x7b, 0xcf, 0x9e, 0x0f, 0x5d, 0x84, 0x73, 0x08, 0x09, 0xa9, 0xe4, - 0x5e, 0xda, 0x18, 0xf4, 0x9e, 0x3d, 0x1f, 0x56, 0xc8, 0x98, 0x19, 0x32, 0xa6, 0xf6, 0xc0, 0x79, - 0xf6, 0x7c, 0x68, 0x78, 0x77, 0xb8, 0xc5, 0xbb, 0xb4, 0x69, 0x62, 0x56, 0x20, 0xdf, 0x76, 0x2c, - 0x6a, 0xf9, 0xb6, 0x53, 0xa7, 0xf5, 0x03, 0x56, 0x26, 0x5f, 0x6e, 0xe7, 0x74, 0xf4, 0xd5, 0xdf, - 0xf6, 0xac, 0x2f, 0x5f, 0xec, 0x59, 0x5f, 0xbd, 0xd8, 0xb3, 0xbe, 0x7e, 0xb1, 0x57, 0xfb, 0xfd, - 0xdf, 0xf7, 0xac, 0x5f, 0x56, 0xff, 0x83, 0x97, 0x42, 0x25, 0xd1, 0x5d, 0x9c, 0x44, 0xf3, 0x48, - 0x16, 0x82, 0x84, 0xa3, 0xd5, 0xed, 0xfc, 0x68, 0x35, 0x3b, 0x42, 0xbe, 0x98, 0xb5, 0xf4, 0x14, - 0xfd, 0xf0, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x41, 0x27, 0x32, 0x8c, 0x51, 0x0f, 0x00, 0x00, + 0x15, 0xb7, 0x6c, 0xd9, 0x96, 0x5b, 0xb6, 0xb7, 0xd3, 0xbb, 0xb5, 0x51, 0x99, 0x30, 0xeb, 0x52, + 0x05, 0x32, 0x4c, 0x55, 0x66, 0xc8, 0x10, 0x28, 0x92, 0xa2, 0x28, 0x66, 0xec, 0x21, 0xe3, 0xcd, + 0x4c, 0x76, 0xd2, 0x9e, 0xc9, 0x81, 0x5b, 0x5b, 0x7a, 0xf1, 0x8a, 0xb1, 0x5b, 0x8e, 0xd4, 0x4a, + 0xc6, 0x7c, 0x84, 0x3d, 0x71, 0xe3, 0xc2, 0x56, 0xf1, 0x09, 0xf8, 0x0a, 0x5c, 0x73, 0xcc, 0x89, + 0x13, 0xc5, 0x9f, 0x85, 0x8f, 0x40, 0x71, 0xa3, 0x8a, 0x7a, 0xdd, 0x92, 0x2c, 0x7b, 0x0b, 0x8a, + 0x85, 0xdc, 0xf4, 0x7e, 0xef, 0xbd, 0xee, 0xd7, 0xef, 0xf5, 0xfb, 0xbd, 0x16, 0x21, 0x4a, 0xa4, + 0xb7, 0x87, 0xab, 0x24, 0x56, 0x31, 0xb3, 0xf1, 0x7b, 0xf0, 0xf6, 0x3c, 0x52, 0x4f, 0xb3, 0xd9, + 0x61, 0x10, 0x2f, 0x8f, 0xe6, 0xf1, 0x3c, 0x3e, 0xd2, 0xca, 0x59, 0xf6, 0xa9, 0x96, 0xb4, 0xa0, + 0xbf, 0x8c, 0xd3, 0xe0, 0xd1, 0x3c, 0x8e, 0xe7, 0x0b, 0xd8, 0x58, 0xa9, 0x68, 0x09, 0xa9, 0x12, + 0xcb, 0x55, 0x6e, 0xd0, 0x5f, 0x82, 0x12, 0xa1, 0x50, 0xc2, 0xc8, 0xfe, 0xaf, 0x2c, 0xd2, 0xbd, + 0x16, 0xe9, 0xed, 0x65, 0x0e, 0xb3, 0x3e, 0xa9, 0x4f, 0xc6, 0x9e, 0x35, 0xb4, 0xf6, 0x3b, 0xbc, + 0x3e, 0x19, 0xb3, 0x03, 0xe2, 0x9c, 0xdd, 0x41, 0x90, 0xa9, 0x38, 0xf1, 0xea, 0x43, 0x6b, 0xbf, + 0x7f, 0xdc, 0x3f, 0xd4, 0x51, 0xa2, 0xd7, 0x28, 0x0e, 0x81, 0x97, 0x7a, 0xe6, 0x91, 0xf6, 0x28, + 0x96, 0x0a, 0xee, 0x94, 0xd7, 0x18, 0x5a, 0xfb, 0x5d, 0x5e, 0x88, 0xec, 0x1d, 0xd2, 0x7e, 0xb2, + 0x52, 0x51, 0x2c, 0x53, 0xcf, 0x1e, 0x5a, 0xfb, 0xee, 0xf1, 0x6b, 0x9b, 0x45, 0x72, 0xc5, 0xa9, + 0xfd, 0xe5, 0x1f, 0x1f, 0xd5, 0x78, 0x61, 0xe7, 0xff, 0xa1, 0x41, 0xfa, 0xd3, 0x8f, 0x2f, 0xcc, + 0x36, 0x66, 0x95, 0x87, 0xa4, 0x85, 0xe2, 0x24, 0xd4, 0xf1, 0xd9, 0x3c, 0x97, 0xd8, 0x80, 0x38, + 0xf8, 0xf5, 0x91, 0x58, 0x82, 0x8e, 0xb1, 0xc3, 0x4b, 0x99, 0xbd, 0x41, 0x3a, 0x27, 0x41, 0x10, + 0x67, 0x52, 0x4d, 0x42, 0x1d, 0x55, 0x8f, 0x6f, 0x00, 0xe6, 0x93, 0xee, 0x58, 0x28, 0x31, 0x13, + 0x29, 0x68, 0x6f, 0x5b, 0x7b, 0x6f, 0x61, 0x78, 0xaa, 0xe9, 0xc7, 0x17, 0xa7, 0x71, 0xb8, 0xf6, + 0x9a, 0x5a, 0x5d, 0x88, 0xec, 0x4d, 0xd2, 0xfb, 0x40, 0x28, 0x18, 0xc5, 0x32, 0x8c, 0x30, 0x68, + 0xaf, 0xa5, 0xf5, 0xdb, 0x20, 0xdb, 0x23, 0x84, 0x83, 0x4a, 0xd6, 0x17, 0xd1, 0x32, 0x52, 0x5e, + 0x5b, 0x87, 0x50, 0x41, 0xd8, 0xb7, 0x49, 0xff, 0x3a, 0x5a, 0x42, 0x9c, 0xa9, 0x29, 0x04, 0xb1, + 0x0c, 0x53, 0xcf, 0xd1, 0x36, 0x3b, 0xa8, 0xce, 0x6e, 0x02, 0x02, 0x0b, 0xd1, 0x31, 0x71, 0xe4, + 0x22, 0xc6, 0x91, 0x7f, 0xde, 0xa4, 0x90, 0x4c, 0x42, 0x8f, 0xe8, 0x05, 0xb6, 0xc1, 0x8a, 0x15, + 0x8f, 0x17, 0x30, 0x09, 0x3d, 0x77, 0xcb, 0xca, 0x80, 0x6c, 0x48, 0xdc, 0xeb, 0x24, 0x9a, 0xcf, + 0x21, 0xb9, 0x5e, 0xaf, 0xc0, 0xeb, 0xea, 0x9d, 0xaa, 0x10, 0x5a, 0x4c, 0x83, 0xa7, 0x10, 0x66, + 0x0b, 0x08, 0x4f, 0x94, 0xd7, 0x1b, 0x5a, 0xfb, 0x0d, 0x5e, 0x85, 0x30, 0xab, 0xb9, 0xc3, 0x08, + 0xf3, 0xec, 0xf5, 0x75, 0xb5, 0xb6, 0x30, 0xff, 0x77, 0x75, 0xe2, 0x56, 0xaa, 0x8f, 0xd1, 0x5d, + 0x8a, 0x3b, 0x9d, 0x16, 0x3c, 0x77, 0xaa, 0x4b, 0xdc, 0xe3, 0xdb, 0x20, 0x5a, 0x69, 0x69, 0x22, + 0x15, 0x24, 0x9f, 0x8b, 0x85, 0x2e, 0x77, 0x83, 0x6f, 0x83, 0x68, 0x35, 0x86, 0x85, 0x58, 0x8f, + 0xb3, 0x44, 0xe8, 0xba, 0x34, 0x8c, 0xd5, 0x16, 0x88, 0xe7, 0x18, 0xc5, 0x32, 0xc8, 0x92, 0x04, + 0x64, 0xb0, 0xd6, 0xa5, 0xef, 0xf1, 0x2a, 0xc4, 0xbe, 0x4f, 0x5a, 0x17, 0x62, 0x06, 0x8b, 0xd4, + 0x6b, 0x0e, 0x1b, 0xfb, 0xee, 0xf1, 0x37, 0x5f, 0xba, 0xb4, 0x87, 0x46, 0x7f, 0x26, 0x55, 0xb2, + 0xe6, 0xb9, 0x31, 0xb6, 0x0c, 0x87, 0x34, 0xce, 0x92, 0x00, 0xf4, 0x8d, 0x70, 0x8b, 0x96, 0x29, + 0x50, 0x5e, 0xea, 0x07, 0xef, 0x11, 0xb7, 0xb2, 0x04, 0xa3, 0xa4, 0x71, 0x0b, 0xeb, 0xbc, 0xfd, + 0xf0, 0x93, 0x3d, 0x20, 0xcd, 0xcf, 0xc5, 0x22, 0x2b, 0x2e, 0xb6, 0x11, 0xde, 0xaf, 0xff, 0xd0, + 0xf2, 0xdf, 0xdd, 0x6c, 0x83, 0x7e, 0xa3, 0xab, 0x9b, 0xbc, 0x2d, 0xf0, 0x13, 0x7b, 0xe5, 0x12, + 0x96, 0x71, 0xb2, 0xd6, 0x8e, 0x36, 0xcf, 0x25, 0xff, 0x43, 0xd2, 0x33, 0xfd, 0x0a, 0x1c, 0xd2, + 0x6c, 0xa1, 0xd8, 0x9b, 0xc4, 0xc6, 0x36, 0xd6, 0xbe, 0xfd, 0x63, 0x5a, 0x46, 0x9a, 0x2d, 0x14, + 0xe2, 0x5c, 0x6b, 0x31, 0x8c, 0xb3, 0x24, 0xc9, 0x39, 0xa0, 0xc3, 0x8d, 0xe0, 0xff, 0xbd, 0x4e, + 0x3a, 0x27, 0xe9, 0x5a, 0x06, 0x98, 0x92, 0x0a, 0x75, 0xd8, 0x9a, 0x3a, 0xde, 0x25, 0x4e, 0x41, + 0x2b, 0xda, 0xcd, 0x3d, 0x66, 0x9b, 0x04, 0x16, 0x9a, 0xbc, 0xed, 0x4b, 0x4b, 0xbc, 0x3c, 0x57, + 0x22, 0x01, 0xa9, 0x74, 0x73, 0x8f, 0x75, 0xed, 0x3a, 0x7c, 0x0b, 0x63, 0xfb, 0xa4, 0x35, 0x55, + 0x42, 0x65, 0x86, 0x4d, 0xca, 0xa8, 0x51, 0x6b, 0x70, 0x9e, 0xeb, 0xb1, 0xf9, 0x10, 0xe5, 0x99, + 0x94, 0x90, 0xe4, 0xfd, 0x5b, 0x41, 0xf4, 0xb9, 0x56, 0x71, 0xf0, 0x54, 0x17, 0xaa, 0xc7, 0x8d, + 0x80, 0x17, 0xe8, 0x42, 0xa4, 0xea, 0x1c, 0x44, 0xa2, 0x66, 0x20, 0x4c, 0xd7, 0x36, 0xf8, 0x36, + 0x88, 0xb4, 0xa3, 0x7b, 0x07, 0x4e, 0x94, 0x6e, 0xd9, 0x06, 0x2f, 0x65, 0x73, 0xb9, 0x96, 0xab, + 0x05, 0x28, 0xdd, 0x24, 0x1d, 0xd3, 0x24, 0x15, 0x88, 0xbd, 0xb7, 0x53, 0x08, 0xdd, 0xb4, 0xee, + 0xf1, 0x7d, 0x73, 0x94, 0x2d, 0x15, 0xdf, 0xb6, 0xf4, 0xff, 0x66, 0xe1, 0xce, 0xb1, 0xfc, 0x1a, + 0xb3, 0x3e, 0x30, 0x2b, 0x9e, 0xdd, 0xad, 0x92, 0x3c, 0xe3, 0xa5, 0x8c, 0xba, 0x8f, 0xe0, 0x4e, + 0x61, 0x07, 0xea, 0x7c, 0x37, 0x78, 0x29, 0x57, 0x5a, 0xdd, 0x74, 0x6d, 0x73, 0xab, 0xd5, 0x35, + 0xb6, 0x95, 0xa7, 0xd6, 0x4e, 0x9e, 0x06, 0xc4, 0xb9, 0x59, 0x85, 0x46, 0x67, 0x92, 0x5c, 0xca, + 0xfe, 0xdb, 0xa4, 0x9d, 0x33, 0xb5, 0x3e, 0x64, 0x58, 0x1e, 0x32, 0x64, 0x8c, 0xd8, 0x15, 0xb6, + 0xd7, 0xdf, 0xfe, 0x67, 0x84, 0x9a, 0x65, 0x47, 0x61, 0x30, 0x06, 0x25, 0xa2, 0x45, 0xba, 0x33, + 0x31, 0x3a, 0xff, 0xd5, 0xc4, 0xf8, 0x0e, 0x71, 0xf2, 0x6d, 0x53, 0xaf, 0xa1, 0xfb, 0xbe, 0x67, + 0x12, 0x98, 0xa3, 0xbc, 0x54, 0xfb, 0x8c, 0x50, 0x0e, 0x0a, 0x24, 0x72, 0x41, 0xbe, 0xa5, 0x7f, + 0x42, 0xdc, 0xc9, 0x74, 0x74, 0xf5, 0x7f, 0x44, 0xe0, 0x9f, 0x13, 0x76, 0x95, 0xcd, 0x16, 0x51, + 0x20, 0x2a, 0x0b, 0xff, 0x4f, 0x2b, 0xfd, 0xbe, 0x4e, 0xda, 0x85, 0xff, 0x90, 0xb8, 0x63, 0x48, + 0x83, 0x24, 0xd2, 0xd4, 0x95, 0x2f, 0x52, 0x85, 0xaa, 0xb3, 0x72, 0xec, 0xd5, 0xb7, 0x67, 0xe5, + 0x18, 0xe7, 0x4f, 0x2e, 0xe4, 0x37, 0xa4, 0x10, 0x75, 0x11, 0x53, 0x48, 0xe4, 0x66, 0x82, 0x96, + 0xf2, 0x86, 0x38, 0x9a, 0x15, 0xe2, 0x60, 0x3f, 0x20, 0x9d, 0xb2, 0x56, 0x7a, 0xc6, 0xb8, 0xc7, + 0x0f, 0x4d, 0x92, 0x77, 0x4b, 0x78, 0x5e, 0xe3, 0x1b, 0x53, 0xf6, 0x16, 0xb1, 0x31, 0xb9, 0x5e, + 0xaf, 0xfa, 0x88, 0xa8, 0xa4, 0xfb, 0xbc, 0xc6, 0xb5, 0x01, 0xfb, 0x11, 0x71, 0x2b, 0x29, 0xd4, + 0x13, 0xc8, 0x3d, 0xf6, 0x8c, 0xfd, 0xcb, 0xb9, 0x3d, 0xaf, 0xf1, 0xaa, 0xf9, 0x69, 0xa7, 0xcc, + 0xda, 0x63, 0xdb, 0x21, 0xd4, 0x7d, 0x6c, 0x3b, 0x2e, 0xed, 0xf2, 0xce, 0x28, 0x96, 0x12, 0x02, + 0x15, 0x27, 0xfe, 0x3f, 0x6d, 0x42, 0xc6, 0x02, 0x96, 0x5f, 0x6b, 0x13, 0x6e, 0xe5, 0xbf, 0xf1, + 0x1f, 0xf2, 0x6f, 0x6f, 0xe7, 0xff, 0xc0, 0xdc, 0x00, 0x3d, 0xb0, 0x9b, 0xbb, 0x6f, 0x34, 0x44, + 0x79, 0xa9, 0xdf, 0x21, 0xc4, 0xd6, 0x4b, 0x84, 0xf8, 0x5d, 0xa3, 0xcf, 0xe9, 0xb5, 0xfd, 0x6f, + 0xe8, 0xb5, 0x62, 0xc3, 0x1e, 0xef, 0x92, 0xa5, 0xa3, 0x0f, 0x3c, 0x38, 0x34, 0x6f, 0xd1, 0xc3, + 0xe2, 0x2d, 0x7a, 0x78, 0x5d, 0xbc, 0x45, 0x4f, 0x1d, 0x3c, 0xf8, 0x2f, 0xff, 0xf4, 0xc8, 0xda, + 0xa5, 0xd4, 0xb7, 0xca, 0xc4, 0x6b, 0xca, 0x2c, 0x5b, 0x2f, 0x07, 0x79, 0xa1, 0x65, 0x3f, 0xa9, + 0x70, 0x0a, 0x79, 0x85, 0xfd, 0x4a, 0x2f, 0x5c, 0xa1, 0x64, 0x1e, 0xf7, 0x55, 0x56, 0x28, 0xbc, + 0xd8, 0xfb, 0xa4, 0x79, 0x26, 0x91, 0xdd, 0xbb, 0xaf, 0xe0, 0x6e, 0x5c, 0xd8, 0x8f, 0x49, 0x1b, + 0x4f, 0xce, 0x33, 0xe9, 0xf5, 0x5e, 0xc1, 0xbb, 0x70, 0x3a, 0xf8, 0xad, 0x55, 0xad, 0x13, 0x73, + 0xf3, 0xb7, 0x21, 0x84, 0xb4, 0x86, 0x02, 0x16, 0x33, 0x92, 0x73, 0x6a, 0xb1, 0x1e, 0xe9, 0x94, + 0x53, 0x87, 0xd6, 0x19, 0x21, 0xad, 0x2b, 0x91, 0xa5, 0x10, 0xd2, 0x06, 0xeb, 0xe4, 0xad, 0x49, + 0x6d, 0xd6, 0x25, 0xce, 0x48, 0xc8, 0x00, 0x16, 0x10, 0xd2, 0x26, 0xbb, 0x4f, 0xee, 0xe1, 0xa4, + 0x59, 0x02, 0x87, 0xcf, 0x32, 0x48, 0xd1, 0xb3, 0xc5, 0x18, 0xe9, 0x6b, 0xcf, 0x0d, 0xd6, 0x46, + 0x43, 0xe3, 0xb6, 0x01, 0x1d, 0xf6, 0x00, 0x49, 0x31, 0x55, 0x22, 0x51, 0x1b, 0xb4, 0x73, 0xf0, + 0x8f, 0xba, 0xb9, 0xa4, 0xfa, 0x35, 0xd1, 0x25, 0xce, 0x35, 0xa4, 0xea, 0x89, 0x5c, 0xac, 0x69, + 0x8d, 0xf5, 0x09, 0x99, 0xae, 0x53, 0x05, 0xcb, 0x89, 0x8c, 0x14, 0xb5, 0x70, 0xa7, 0x4b, 0x50, + 0x49, 0x14, 0x5c, 0xc4, 0xf3, 0x4b, 0x48, 0xe6, 0x40, 0xeb, 0xec, 0x21, 0x61, 0x06, 0x9b, 0xaa, + 0x38, 0x11, 0x73, 0xb8, 0x49, 0xc5, 0x1c, 0x68, 0x83, 0xdd, 0x23, 0xae, 0x36, 0x79, 0x32, 0xfb, + 0x39, 0x04, 0x8a, 0x36, 0xf1, 0xf0, 0xb8, 0xcc, 0x28, 0x0c, 0x68, 0x9b, 0x51, 0xd2, 0xbd, 0x7c, + 0x72, 0x2d, 0x66, 0x0b, 0xc0, 0x3c, 0xa5, 0xd4, 0x41, 0x04, 0xf9, 0xa1, 0xf8, 0x65, 0xa1, 0x1d, + 0xf6, 0x0d, 0xf2, 0xfa, 0x44, 0x86, 0x70, 0x67, 0xca, 0x8a, 0x21, 0x96, 0x4a, 0xc2, 0x5e, 0x27, + 0xf7, 0x2b, 0xbc, 0x50, 0x2a, 0x5c, 0xdc, 0x26, 0xff, 0x39, 0xa1, 0x5d, 0xb4, 0xc2, 0x3f, 0x86, + 0xd3, 0x44, 0xc8, 0xe0, 0xe9, 0x45, 0x24, 0x41, 0xcc, 0xe1, 0x83, 0x11, 0xed, 0x61, 0xd4, 0x79, + 0x30, 0x53, 0x85, 0x51, 0xe8, 0xd7, 0x05, 0xed, 0x33, 0x8f, 0x3c, 0xc8, 0xf1, 0x8b, 0x38, 0x4d, + 0x17, 0x90, 0xa6, 0x53, 0xcc, 0x17, 0xbd, 0xc7, 0x06, 0xe4, 0x61, 0xe1, 0xa1, 0x5f, 0x76, 0x57, + 0x42, 0x29, 0x48, 0xe4, 0x27, 0xef, 0x50, 0x8a, 0x89, 0xbd, 0x14, 0x0a, 0x92, 0x48, 0x2c, 0xa2, + 0x5f, 0x40, 0xf8, 0x49, 0x04, 0x5f, 0xd0, 0xd7, 0x7c, 0xdb, 0xb1, 0xa9, 0xed, 0xdb, 0x4e, 0x8b, + 0xb6, 0x0e, 0x58, 0x49, 0x50, 0x1f, 0x8a, 0x4f, 0x6f, 0xc5, 0x34, 0x92, 0xb7, 0x07, 0xdf, 0x22, + 0xc4, 0x3c, 0x1b, 0x74, 0xe6, 0x31, 0xee, 0x2c, 0x08, 0x20, 0x4d, 0x69, 0x0d, 0x2f, 0xc3, 0x4f, + 0x45, 0x84, 0x35, 0xb7, 0x0e, 0x7e, 0x6d, 0x6d, 0x48, 0x84, 0xbd, 0x41, 0xda, 0x37, 0xf2, 0x56, + 0xc6, 0x5f, 0x48, 0x5a, 0x1b, 0xdc, 0x7b, 0xf6, 0x7c, 0xe8, 0x22, 0x9c, 0x43, 0x48, 0x53, 0x25, + 0x23, 0xd3, 0xc6, 0xa0, 0xf7, 0xec, 0xf9, 0x70, 0x03, 0xe0, 0x68, 0xc6, 0x0c, 0x53, 0x7b, 0xe0, + 0x3c, 0x7b, 0x3e, 0xd4, 0xdf, 0x38, 0x7a, 0x2a, 0x69, 0xa4, 0x4d, 0xb3, 0x66, 0x05, 0xf2, 0x6d, + 0xc7, 0xa2, 0x96, 0x6f, 0x3b, 0x75, 0x5a, 0x3f, 0x60, 0x65, 0xf0, 0xe5, 0x71, 0x4e, 0x47, 0x5f, + 0xfd, 0x65, 0xcf, 0xfa, 0xf2, 0xc5, 0x9e, 0xf5, 0xd5, 0x8b, 0x3d, 0xeb, 0xcf, 0x2f, 0xf6, 0x6a, + 0xbf, 0xf9, 0xeb, 0x9e, 0xf5, 0xb3, 0xea, 0xdf, 0xf1, 0x52, 0xa8, 0x24, 0xba, 0x8b, 0x93, 0x68, + 0x1e, 0xc9, 0x42, 0x90, 0x70, 0xb4, 0xba, 0x9d, 0x1f, 0xad, 0x66, 0x47, 0xc8, 0x22, 0xb3, 0x96, + 0xee, 0xad, 0xef, 0xfd, 0x6b, 0x00, 0x74, 0x6f, 0x1c, 0xb9, 0x67, 0x0f, 0x00, 0x00, } func (m *TaskMetadata) Marshal() (dAtA []byte, err error) { diff --git a/pkg/sql/colexec/insert/insert.go b/pkg/sql/colexec/insert/insert.go index eea48874e6a22..d3e0607e10e9d 100644 --- a/pkg/sql/colexec/insert/insert.go +++ b/pkg/sql/colexec/insert/insert.go @@ -355,6 +355,11 @@ func (insert *Insert) insert_s3(proc *process.Process, analyzer process.Analyzer atomic.AddUint64(&insert.ctr.affectedRows, affectedRows) } + if insert.InsertCtx.TableDef != nil { + if err := defines.ChargeMaterializedViewOutput(proc.Ctx, insert.InsertCtx.TableDef.TblId, input.Batch.Size()); err != nil { + return vm.CancelResult, err + } + } // write to s3. input.Batch.Attrs = append(input.Batch.Attrs[:0], insert.InsertCtx.Attrs...) if err = insert.acquireS3WriteMemory(proc, analyzer, input.Batch.Size()); err != nil { @@ -553,6 +558,11 @@ func (insert *Insert) insert_table(proc *process.Process, analyzer process.Analy } input := insert.input + if insert.InsertCtx.TableDef != nil { + if err := defines.ChargeMaterializedViewOutput(proc.Ctx, insert.InsertCtx.TableDef.TblId, input.Batch.Size()); err != nil { + return vm.CancelResult, err + } + } affectedRows := uint64(input.Batch.RowCount()) insert.ctr.buf.CleanOnlyData() for i := range insert.ctr.buf.Attrs { diff --git a/pkg/sql/colexec/insert/materialized_view_test.go b/pkg/sql/colexec/insert/materialized_view_test.go new file mode 100644 index 0000000000000..033333d762998 --- /dev/null +++ b/pkg/sql/colexec/insert/materialized_view_test.go @@ -0,0 +1,43 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package insert + +import ( + "testing" + + "github.com/matrixorigin/matrixone/pkg/container/batch" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/testutil" + "github.com/matrixorigin/matrixone/pkg/vm" + "github.com/matrixorigin/matrixone/pkg/vm/process" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewWriterBudget(t *testing.T) { + proc := testutil.NewProcess(t) + proc.Ctx = defines.WithMaterializedViewBudget(proc.Ctx, 99, 1) + bat := batch.NewWithSize(1) + bat.Vecs[0] = vector.NewVec(types.T_int64.ToType()) + require.NoError(t, vector.AppendFixed(bat.Vecs[0], int64(10), false, proc.Mp())) + bat.SetRowCount(1) + t.Cleanup(func() { bat.Clean(proc.Mp()) }) + op := &Insert{delegated: true, input: vm.CallResult{Batch: bat}, InsertCtx: &InsertCtx{TableDef: &plan.TableDef{TblId: 99}}} + // An uninitialized writer would panic if execution reached native Write. + _, err := op.insert_table(proc, process.NewTempAnalyzer()) + require.ErrorContains(t, err, "output budget exceeded") +} diff --git a/pkg/sql/colexec/multi_update/materialized_view_test.go b/pkg/sql/colexec/multi_update/materialized_view_test.go new file mode 100644 index 0000000000000..b3bc809f63c5a --- /dev/null +++ b/pkg/sql/colexec/multi_update/materialized_view_test.go @@ -0,0 +1,42 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package multi_update + +import ( + "testing" + + "github.com/matrixorigin/matrixone/pkg/container/batch" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/testutil" + "github.com/matrixorigin/matrixone/pkg/vm" + "github.com/matrixorigin/matrixone/pkg/vm/process" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewWriterBudget(t *testing.T) { + proc := testutil.NewProcess(t) + proc.Ctx = defines.WithMaterializedViewBudget(proc.Ctx, 99, 1) + bat := batch.NewWithSize(1) + bat.Vecs[0] = vector.NewVec(types.T_int64.ToType()) + require.NoError(t, vector.AppendFixed(bat.Vecs[0], int64(10), false, proc.Mp())) + bat.SetRowCount(1) + t.Cleanup(func() { bat.Clean(proc.Mp()) }) + op := &MultiUpdate{delegated: true, input: vm.CallResult{Batch: bat}, mainTable: 99} + op.ctr.action = actionInsert + _, err := op.update(proc, process.NewTempAnalyzer()) + require.ErrorContains(t, err, "output budget exceeded") +} diff --git a/pkg/sql/colexec/multi_update/multi_update.go b/pkg/sql/colexec/multi_update/multi_update.go index 03bf89c6cf2e2..99ee14e7600de 100644 --- a/pkg/sql/colexec/multi_update/multi_update.go +++ b/pkg/sql/colexec/multi_update/multi_update.go @@ -219,6 +219,11 @@ func (update *MultiUpdate) update_s3(proc *process.Process, analyzer process.Ana return result, nil } + if update.ctr.action == actionInsert { + if err := defines.ChargeMaterializedViewOutput(proc.Ctx, update.mainTable, input.Batch.Size()); err != nil { + return vm.CancelResult, err + } + } w, err := update.getS3WriterFunc(proc.GetService(), update.mainTable) if err != nil { return vm.CancelResult, err @@ -281,6 +286,11 @@ func (update *MultiUpdate) update(proc *process.Process, analyzer process.Analyz } input := update.input + if update.ctr.action == actionInsert { + if err := defines.ChargeMaterializedViewOutput(proc.Ctx, update.mainTable, input.Batch.Size()); err != nil { + return vm.CancelResult, err + } + } err := update.updateOneBatch(proc, analyzer, input.Batch) if err != nil { return vm.CancelResult, err diff --git a/pkg/sql/compile/alter.go b/pkg/sql/compile/alter.go index 91a72c257c7f8..cda6e5f76a848 100644 --- a/pkg/sql/compile/alter.go +++ b/pkg/sql/compile/alter.go @@ -1292,6 +1292,11 @@ func (s *Scope) alterTableCopy(c *Compile, cleanup *alterAutoIncrementResetClean } } + if !isTemp { + if err := c.guardMaterializedViewDDL(dbName, tblName, false); err != nil { + return err + } + } if lineagePlan.enabled { if columnName, replaced := alterCopySameStatementColumnReplacement(qry); replaced { return moerr.NewNotSupportedNoCtxf( diff --git a/pkg/sql/compile/compile.go b/pkg/sql/compile/compile.go index 026dca0aac792..3cb8071264c53 100644 --- a/pkg/sql/compile/compile.go +++ b/pkg/sql/compile/compile.go @@ -1391,6 +1391,9 @@ func (c *Compile) compileQuery(qry *plan.Query) ([]*Scope, error) { c.execType = vectorQueryExecType(sequenceExecType( plan2.GetExecType(c.pn.GetQuery(), c.getHaveDDL(), c.isPrepare), qry), qry) + if defines.MaterializedViewWriteActive(c.proc.Ctx) { + c.execType = plan2.ExecTypeAP_ONECN + } c.cnList, err = c.scheduleQueryWorkers() if err != nil { return nil, err @@ -2402,7 +2405,7 @@ func (c *Compile) canUseLiteralLimitZeroFastPath(node *plan.Node) bool { return false } cval, ok := cExpr.Lit.Value.(*plan.Literal_U64Val) - return ok && cval.U64Val == 0 + return ok && cval.U64Val == 0 && !c.containsMaterializedViewScan(node) } func (c *Compile) ownsFoundRows(node *plan.Node) bool { @@ -5413,6 +5416,9 @@ func (c *Compile) compileValueScan(node *plan.Node) ([]*Scope, error) { } func (c *Compile) compileTableScan(node *plan.Node) ([]*Scope, error) { + if err := c.validateMaterializedViewScan(node.TableDef); err != nil { + return nil, err + } stats := statistic.StatsInfoFromContext(c.proc.GetTopContext()) compileStart := time.Now() defer func() { @@ -9141,6 +9147,11 @@ func (c *Compile) compilePreInsert(nodes []*plan.Node, node *plan.Node, ss []*Sc } func (c *Compile) compileInsert(nodes []*plan.Node, node *plan.Node, ss []*Scope) ([]*Scope, error) { + if node.InsertCtx != nil { + if err := c.validateMaterializedViewWrite(node.InsertCtx.TableDef); err != nil { + return nil, err + } + } if ok, err := isIcebergAppendInsert(c.proc.Ctx, node); err != nil { return nil, err } else if ok { @@ -9352,6 +9363,11 @@ func icebergInsertNeedsSingleWriterMerge(ss []*Scope, currentCN engine.Node) boo } func (c *Compile) compileMultiUpdate(node *plan.Node, ss []*Scope) ([]*Scope, error) { + for _, update := range node.UpdateCtxList { + if err := c.validateMaterializedViewWrite(update.TableDef); err != nil { + return nil, err + } + } // Determine whether to Write S3 toWriteS3 := node.Stats.GetOutcnt()*float64(SingleLineSizeEstimate) > float64(DistributedThreshold) || c.anal.qry.LoadWriteS3 @@ -9468,6 +9484,11 @@ func (c *Compile) compilePreInsertSK(node *plan.Node, ss []*Scope) []*Scope { } func (c *Compile) compileDelete(node *plan.Node, ss []*Scope) ([]*Scope, error) { + if node.DeleteCtx != nil { + if err := c.validateMaterializedViewWrite(node.DeleteCtx.TableDef); err != nil { + return nil, err + } + } currentFirstFlag := c.anal.isFirst op, err := constructDeletion(c.proc, node, c.e) if err != nil { diff --git a/pkg/sql/compile/ddl.go b/pkg/sql/compile/ddl.go index 92c9761c0ee2b..eec0489002132 100644 --- a/pkg/sql/compile/ddl.go +++ b/pkg/sql/compile/ddl.go @@ -269,6 +269,9 @@ func (s *Scope) DropDatabase(c *Compile) error { return moerr.NewErrDropNonExistsDB(c.proc.Ctx, dbName) } } + if err := c.guardMaterializedViewDatabaseDDL(dbName); err != nil { + return err + } // RC admission already installed a TN-ordered applied snapshot after D; // publication writers hold that same D key through their catalog write. if err := ensureDatabaseNotPublished(c, db, dbName); err != nil { @@ -1125,6 +1128,11 @@ func (s *Scope) alterTableInplace(c *Compile, cleanup *alterAutoIncrementResetCl } } + if !isTemp { + if err := c.guardMaterializedViewDDL(dbName, tblName, false); err != nil { + return err + } + } initialForeignKeyParents := foreignKeyParentIDs(oTableDef.Fkeys) var hasUpdateConstraints bool @@ -1912,6 +1920,9 @@ func (s *Scope) createTable(c *Compile, tableCreated func()) error { tblName := qry.GetTableDef().GetName() + if err := c.pinMaterializedViewSourceNames(qry, dbName); err != nil { + return err + } if err := c.admitCreateNames(qry, dbName); err != nil { return err } @@ -2449,6 +2460,9 @@ func (s *Scope) createTable(c *Compile, tableCreated func()) error { } } + if err := c.registerMaterializedView(dbSource, dbName, tblName, qry.TableDef); err != nil { + return err + } if err := c.populateCreatedTable(qry, isTemp, dbName, aliasName, tblName); err != nil { return err } @@ -3177,6 +3191,9 @@ func (s *Scope) CreateIndex(c *Compile) error { } } + if err := c.guardMaterializedViewDDL(qry.Database, qry.Table, false); err != nil { + return err + } ps := c.proc.GetPartitionService() if !ps.Enabled() || !features.IsPartitioned(r.GetExtraInfo().FeatureFlag) { @@ -3556,6 +3573,9 @@ func (s *Scope) DropIndex(c *Compile) error { } } + if err := c.guardMaterializedViewDDL(qry.Database, qry.Table, false); err != nil { + return err + } // old tabledef oldTableDef := r.CopyTableDef(c.proc.Ctx) if err := plan2.CheckDropReferencedKeyForeignKeyDependency(c.proc.Ctx, oldTableDef, qry.IndexName, nil, @@ -4121,6 +4141,9 @@ func (s *Scope) TruncateTable(c *Compile) error { } } + if err := c.guardMaterializedViewDDL(db, table, false); err != nil { + return err + } // TRUNCATE is a copy-and-swap rebuild: it creates a replacement relation // before the ordinary DROP path retires the old physical generation. Reuse // ALTER's lineage publication protocol so the replacement remains the live @@ -4810,6 +4833,11 @@ func (s *Scope) dropTableSingleResolved( } } + if !isTemp { + if err := c.guardMaterializedViewDDL(dbName, tblName, false); err != nil { + return err + } + } // if dbSource is a pub, update tableList if !c.ignorePublish { if err = updatePubTableList(c.proc.Ctx, c, dbName, tblName); err != nil { diff --git a/pkg/sql/compile/lifecycle_fk_scope.go b/pkg/sql/compile/lifecycle_fk_scope.go index c00da4774f0d4..6a57f7f57eb19 100644 --- a/pkg/sql/compile/lifecycle_fk_scope.go +++ b/pkg/sql/compile/lifecycle_fk_scope.go @@ -508,6 +508,13 @@ func createNameDomain(q *plan.CreateTable, database string) map[plan2.FkReferKey database = q.Database } domain[plan2.FkReferKey{Db: database, Tbl: q.GetTableDef().GetName()}] = struct{}{} + // MV publication and source DDL own the same name frontier. Include every + // source before any target/source lock or snapshot advancement occurs. + if definition, err := catalog.MaterializedViewDefinition(q.GetTableDef()); err == nil && definition != nil { + for _, source := range definition.Sources { + domain[plan2.FkReferKey{Db: source.Database, Tbl: source.Table}] = struct{}{} + } + } for i, name := range q.FkTables { if i < len(q.FkDbs) { domain[plan2.FkReferKey{Db: q.FkDbs[i], Tbl: name}] = struct{}{} diff --git a/pkg/sql/compile/materialized_view.go b/pkg/sql/compile/materialized_view.go new file mode 100644 index 0000000000000..c5bc92f10f843 --- /dev/null +++ b/pkg/sql/compile/materialized_view.go @@ -0,0 +1,281 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package compile + +import ( + "fmt" + "sort" + "strconv" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + moruntime "github.com/matrixorigin/matrixone/pkg/common/runtime" + "github.com/matrixorigin/matrixone/pkg/common/sqlquote" + "github.com/matrixorigin/matrixone/pkg/container/vector" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/mv" + "github.com/matrixorigin/matrixone/pkg/pb/lock" + "github.com/matrixorigin/matrixone/pkg/pb/plan" + plan2 "github.com/matrixorigin/matrixone/pkg/sql/plan" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "github.com/matrixorigin/matrixone/pkg/vm/engine" +) + +func (c *Compile) mvTxn(f func(executor.TxnExecutor) error) error { + v, ok := moruntime.ServiceRuntime(c.proc.GetService()).GetGlobalVariables(moruntime.InternalSQLExecutor) + if !ok { + return moerr.NewInternalError(c.proc.Ctx, "materialized view SQL executor unavailable") + } + // The outer DDL/scan owns the active statement workspace. Nested catalog + // operations reuse it without starting a second statement or advancing S. + return v.(executor.SQLExecutor).ExecTxn(c.proc.Ctx, f, executor.Options{}.WithTxn(c.proc.GetTxnOperator()).WithDatabase(c.db).WithDisableIncrStatement()) +} + +func (c *Compile) registerMaterializedView(db engine.Database, dbName, name string, def *plan.TableDef) error { + definition, err := catalog.MaterializedViewDefinition(def) + if err != nil { + return err + } + if definition == nil { + return nil + } + if err := plan2.RequirePersistedProtocolVersionForAuthoring(c.proc.Ctx, c.proc, defines.MORPCVersion119); err != nil { + return err + } + r, err := db.Relation(c.proc.Ctx, name, nil) + if err != nil { + return err + } + dbID, err := strconv.ParseUint(db.GetDatabaseId(c.proc.Ctx), 10, 64) + if err != nil { + return err + } + account, err := defines.GetAccountId(c.proc.Ctx) + if err != nil { + return err + } + return c.mvTxn(func(tx executor.TxnExecutor) error { + return mv.Register(tx, mv.Key{Account: account, ID: r.GetTableID(c.proc.Ctx)}, dbID, name, definition) + }) +} + +func (c *Compile) validateMaterializedViewScan(def *plan.TableDef) error { + if def == nil || def.TableType != catalog.SystemMaterializedViewRel { + return nil + } + if err := plan2.RequirePersistedProtocolVersion(c.proc.Ctx, c.proc, defines.MORPCVersion119); err != nil { + return err + } + account, err := defines.GetAccountId(c.proc.Ctx) + if err != nil { + return err + } + if defines.CanWriteMaterializedView(c.proc.Ctx, account, def.TblId, c.proc.GetTxnOperator().Txn().ID) { + return nil + } + return c.mvTxn(func(tx executor.TxnExecutor) error { + st, err := mv.Load(tx, mv.Key{Account: account, ID: def.TblId}) + if err != nil { + return err + } + if !st.Populated { + return moerr.NewInvalidInput(c.proc.Ctx, "MV_NOT_POPULATED: refresh materialized view before querying it") + } + return mv.ValidateSources(tx, st) + }) +} + +// Guard source DDL and the MV through durable dependencies after existing +// lifecycle/name admission has acquired the target locks and refreshed RC state. +// Pessimistic CREATE MV pins those source names through publication. Optimistic +// SI has no name locks and retains a write/write fence through commit. +func (c *Compile) guardMaterializedViewDDL(dbName, name string, allowMV bool) error { + if dbName == "" { + dbName = c.db + } + if session := c.proc.GetSession(); session != nil { + if _, temporary := session.GetTempTable(dbName, name); temporary { + return nil + } + } + if !catalog.IsMaterializedViewDatabase(dbName) { + return nil + } + if _, ok := moruntime.ServiceRuntime(c.proc.GetService()).GetGlobalVariables(mv.RuntimeKey); !ok { + return nil + } + account, err := defines.GetAccountId(c.proc.Ctx) + if err != nil { + return err + } + db, err := c.e.Database(c.proc.Ctx, dbName, c.proc.GetTxnOperator()) + if err != nil { + return err + } + r, err := db.Relation(c.proc.Ctx, name, nil) + if err != nil { + return err + } + def := r.GetTableDef(c.proc.Ctx) + if def.TableType == catalog.SystemMaterializedViewRel && !allowMV && !defines.CanWriteMaterializedView(c.proc.Ctx, account, def.TblId, c.proc.GetTxnOperator().Txn().ID) { + return moerr.NewInvalidInput(c.proc.Ctx, "materialized view is read only; use DROP/ALTER MATERIALIZED VIEW") + } + return c.mvTxn(func(tx executor.TxnExecutor) error { + ready, err := mv.CatalogReady(tx) + if err != nil || !ready { + return err + } + if !c.proc.GetTxnOperator().Txn().IsPessimistic() { + if err := mv.DependencyGuard(tx, account); err != nil { + return err + } + } + res, err := tx.Exec(fmt.Sprintf("select mv_id from mo_catalog.mo_mv_dependencies where account_id=%d and source_table_id=%d limit 1", account, def.TblId), executor.StatementOption{}.WithAccountID(catalog.System_Account)) + if err != nil { + return err + } + defer res.Close() + rows := 0 + res.ReadRows(func(n int, _ []*vector.Vector) bool { rows += n; return false }) + if rows > 0 { + return moerr.NewInvalidInput(c.proc.Ctx, "source has dependent materialized views; drop them before changing its schema/identity") + } + return nil + }) +} + +func (c *Compile) validateMaterializedViewWrite(def *plan.TableDef) error { + if def == nil || def.TableType != catalog.SystemMaterializedViewRel { + return nil + } + account, err := defines.GetAccountId(c.proc.Ctx) + if err != nil { + return err + } + if !defines.CanWriteMaterializedView(c.proc.Ctx, account, def.TblId, c.proc.GetTxnOperator().Txn().ID) { + return moerr.NewInvalidInput(c.proc.Ctx, "materialized view is read only") + } + return nil +} + +// DROP DATABASE uses RESTRICT while materialized views or their sources exist. +// Dropping the views first leaves no global catalog rows orphaned. +func (c *Compile) guardMaterializedViewDatabaseDDL(dbName string) error { + if !catalog.IsMaterializedViewDatabase(dbName) { + return nil + } + if _, ok := moruntime.ServiceRuntime(c.proc.GetService()).GetGlobalVariables(mv.RuntimeKey); !ok { + return nil + } + account, err := defines.GetAccountId(c.proc.Ctx) + if err != nil { + return err + } + return c.mvTxn(func(tx executor.TxnExecutor) error { + ready, err := mv.CatalogReady(tx) + if err != nil || !ready { + return err + } + if !c.proc.GetTxnOperator().Txn().IsPessimistic() { + if err := mv.DependencyGuard(tx, account); err != nil { + return err + } + } + r, err := tx.Exec(fmt.Sprintf("select mv_id from mo_catalog.mo_materialized_views where account_id=%d and database_name='%s' limit 1", account, sqlquote.EscapeString(dbName)), executor.StatementOption{}.WithAccountID(catalog.System_Account)) + if err != nil { + return err + } + defer r.Close() + rows := 0 + r.ReadRows(func(n int, _ []*vector.Vector) bool { rows += n; return false }) + if rows != 0 { + return moerr.NewInvalidInput(c.proc.Ctx, "database contains materialized views; drop them first") + } + return nil + }) +} + +// SI creation pins the complete source/target name domain before publication. +// RC uses pinCreateNames, including source names, and its TN-ordered snapshot. +func (c *Compile) pinMaterializedViewSourceNames(q *plan.CreateTable, database string) error { + definition, err := catalog.MaterializedViewDefinition(q.TableDef) + if err != nil || definition == nil { + return err + } + if !c.proc.GetTxnOperator().Txn().IsPessimistic() { + return nil + } + if c.disableLock { + return moerr.NewInternalError(c.proc.Ctx, "materialized view creation requires lifecycle name locks") + } + if c.isLifecycleRC() { + return nil + } + if err := lockMoDatabase(c, database, lock.LockMode_Shared); err != nil { + return err + } + names := make([]string, 0, len(definition.Sources)+1) + names = append(names, q.TableDef.Name) + for _, source := range definition.Sources { + names = append(names, source.Table) + } + sort.Strings(names) + for i, name := range names { + if i > 0 && name == names[i-1] { + continue + } + if err := lockMoTable(c, database, name, lock.LockMode_Exclusive); err != nil { + return err + } + } + return nil +} + +// Empty-result compilation must still reach the existing MV scan validation. +// This bounded metadata walk runs only for a literal LIMIT 0 candidate; it does +// not fetch catalogs or create a second population/privilege validator. +func (c *Compile) containsMaterializedViewScan(root *plan.Node) bool { + query := c.pn.GetQuery() + queue := []*plan.Node{root} + seen := make(map[*plan.Node]struct{}) + for len(queue) > 0 { + node := queue[len(queue)-1] + queue = queue[:len(queue)-1] + if node == nil { + continue + } + if _, ok := seen[node]; ok { + continue + } + seen[node] = struct{}{} + if node.NodeType == plan.Node_TABLE_SCAN && node.TableDef.GetTableType() == catalog.SystemMaterializedViewRel { + return true + } + for _, child := range node.Children { + if child >= 0 && int(child) < len(query.GetNodes()) { + queue = append(queue, query.Nodes[child]) + } + } + for _, step := range node.SourceStep { + if step >= 0 && int(step) < len(query.GetSteps()) { + child := query.Steps[step] + if child >= 0 && int(child) < len(query.GetNodes()) { + queue = append(queue, query.Nodes[child]) + } + } + } + } + return false +} diff --git a/pkg/sql/compile/materialized_view_test.go b/pkg/sql/compile/materialized_view_test.go new file mode 100644 index 0000000000000..1a1c4a9ff7ad8 --- /dev/null +++ b/pkg/sql/compile/materialized_view_test.go @@ -0,0 +1,317 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package compile + +import ( + "context" + "encoding/json" + "fmt" + "github.com/matrixorigin/matrixone/pkg/txn/client" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "strings" + "testing" + + "github.com/golang/mock/gomock" + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + moruntime "github.com/matrixorigin/matrixone/pkg/common/runtime" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/defines" + mock_frontend "github.com/matrixorigin/matrixone/pkg/frontend/test" + "github.com/matrixorigin/matrixone/pkg/mv" + "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/pb/txn" + plan2 "github.com/matrixorigin/matrixone/pkg/sql/plan" + "github.com/matrixorigin/matrixone/pkg/testutil" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewExecutionCapability(t *testing.T) { + proc := testutil.NewProcess(t) + proc.Ctx = defines.AttachAccountId(proc.Ctx, 7) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + op.EXPECT().Txn().Return(txn.TxnMeta{ID: []byte("execution")}).AnyTimes() + proc.Base.TxnOperator = op + c := &Compile{proc: proc} + def := &plan.TableDef{TableType: catalog.SystemMaterializedViewRel, TblId: 99} + require.Error(t, c.validateMaterializedViewWrite(def)) + proc.Ctx = defines.WithMaterializedViewWrite(proc.Ctx, 7, 99, []byte("binding")) + require.Error(t, c.validateMaterializedViewWrite(def)) + proc.Ctx = defines.WithMaterializedViewWrite(proc.Ctx, 7, 99, []byte("execution")) + require.NoError(t, c.validateMaterializedViewWrite(def)) + def.TblId = 100 + require.Error(t, c.validateMaterializedViewWrite(def)) + def.TableType = catalog.SystemOrdinaryRel + require.NoError(t, c.validateMaterializedViewWrite(def)) +} + +func TestMaterializedViewCompileProtocolAdmission(t *testing.T) { + for _, tc := range []struct { + name string + protocol, floor int64 + register bool + ordinary bool + wantErr bool + }{ + {"old scan protocol", defines.MORPCVersion118, defines.MORPCVersion119, false, false, true}, + {"current scan protocol", defines.MORPCVersion119, defines.MORPCVersion119, false, false, false}, + {"ordinary scan", defines.MORPCVersion118, defines.MORPCVersion118, false, true, false}, + {"old registration protocol", defines.MORPCVersion118, defines.MORPCVersion119, true, false, true}, + {"old registration floor", defines.MORPCVersion119, defines.MORPCVersion118, true, false, true}, + } { + t.Run(tc.name, func(t *testing.T) { + proc := testutil.NewProcess(t) + proc.Ctx = defines.AttachAccountId(proc.Ctx, 7) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + op.EXPECT().Txn().Return(txn.TxnMeta{ID: []byte("execution")}).AnyTimes() + proc.Base.TxnOperator = op + proc.Ctx = defines.WithMaterializedViewWrite(proc.Ctx, 7, 99, []byte("execution")) + rt := moruntime.ServiceRuntime(proc.GetService()) + for key, value := range map[string]int64{ + moruntime.MOProtocolVersion: tc.protocol, moruntime.PersistedExpressionProtocolAuthoringFloor: tc.floor, + } { + old, present := rt.GetGlobalVariables(key) + rt.SetGlobalVariables(key, value) + t.Cleanup(func() { + if present { + rt.SetGlobalVariables(key, old) + } else { + rt.CompareAndDeleteGlobalVariables(key, value) + } + }) + } + def := &plan.TableDef{TableType: catalog.SystemMaterializedViewRel, TblId: 99, + Props: []*plan.PropertyDef{{Key: catalog.MaterializedViewProperty, + Value: `{"format_version":1,"query":"select * from t","sources":[{"table":"t"}]}`}}} + if tc.ordinary { + def.TableType = catalog.SystemOrdinaryRel + } + c := &Compile{proc: proc} + var err error + if tc.register { + // Rejection must precede relation lookup and catalog publication. + err = c.registerMaterializedView(nil, "db", "mv", def) + } else { + err = c.validateMaterializedViewScan(def) + } + if tc.wantErr { + require.True(t, moerr.IsMoErrCode(err, moerr.ErrNotSupported), "%v", err) + } else { + require.NoError(t, err) + } + }) + } +} + +type materializedViewNestedExecutor struct { + executor.SQLExecutor + t *testing.T + op client.TxnOperator +} + +func (e *materializedViewNestedExecutor) ExecTxn(_ context.Context, f func(executor.TxnExecutor) error, opts executor.Options) error { + require.True(e.t, opts.DisableIncrStatement(), "nested catalog work must not start a second active statement") + require.Same(e.t, e.op, opts.Txn()) + return f(executor.NewMemTxnExecutor(func(string) (executor.Result, error) { return executor.Result{}, nil }, e.op)) +} +func TestMaterializedViewNestedStatementOwnership(t *testing.T) { + proc := testutil.NewProcess(t) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + proc.Base.TxnOperator = op + inner := &materializedViewNestedExecutor{t: t, op: op} + installDropDDLExecutor(t, proc, inner) + c := &Compile{proc: proc, db: "db"} + require.NoError(t, c.mvTxn(func(tx executor.TxnExecutor) error { + require.Same(t, op, tx.Txn()) + r, err := tx.Exec("select 1", executor.StatementOption{}) + if err == nil { + r.Close() + } + return err + })) +} + +func TestMaterializedViewSourceNameAdmissionDomain(t *testing.T) { + definition := catalog.MVDefinition{FormatVersion: 1, Query: "select * from a", Sources: []catalog.MVSource{ + {Database: "db", Table: "b"}, {Database: "db", Table: "a"}, {Database: "db", Table: "a"}, + }} + data, err := json.Marshal(definition) + require.NoError(t, err) + q := &plan.CreateTable{Database: "db", TableDef: &plan.TableDef{Name: "mv", TableType: catalog.SystemMaterializedViewRel, + Props: []*plan.PropertyDef{{Key: catalog.MaterializedViewProperty, Value: string(data)}}}} + domain := createNameDomain(q, "") + require.Len(t, domain, 3) + for _, name := range []string{"mv", "a", "b"} { + require.Contains(t, domain, plan2.FkReferKey{Db: "db", Tbl: name}) + } + changed := plan2.DeepCopyCreateTable(q) + definition.Sources[0].Table = "other" + data, err = json.Marshal(definition) + require.NoError(t, err) + changed.TableDef.Props[0].Value = string(data) + require.False(t, sameCreateNameDomain(q, changed), "replanning cannot silently change the locked source domain") + q.TableDef.TableType = catalog.SystemOrdinaryRel + require.Len(t, createNameDomain(q, ""), 1, "ordinary CREATE must not pin MV source names") +} + +func TestMaterializedViewDDLGuardDoesNotWriteAccountFence(t *testing.T) { + for _, dependent := range []bool{false, true} { + t.Run(map[bool]string{false: "ordinary", true: "dependent"}[dependent], func(t *testing.T) { + ctrl := gomock.NewController(t) + proc := testutil.NewProcess(t) + proc.Ctx = defines.AttachAccountId(proc.Ctx, 7) + op := mock_frontend.NewMockTxnOperator(ctrl) + op.EXPECT().Txn().Return(txn.TxnMeta{Mode: txn.TxnMode_Pessimistic, Isolation: txn.TxnIsolation_RC}).AnyTimes() + proc.Base.TxnOperator = op + eng := mock_frontend.NewMockEngine(ctrl) + database := mock_frontend.NewMockDatabase(ctrl) + relation := mock_frontend.NewMockRelation(ctrl) + eng.EXPECT().Database(proc.Ctx, "db", op).Return(database, nil) + database.EXPECT().Relation(proc.Ctx, "source", nil).Return(relation, nil) + relation.EXPECT().GetTableDef(proc.Ctx).Return(&plan.TableDef{TableType: catalog.SystemOrdinaryRel, TblId: 99}) + calls := 0 + exec := executor.NewMemExecutor2(func(sql string) (executor.Result, error) { + if sql == mv.CatalogReadinessSQL { + res := executor.NewMemResult([]types.Type{types.T_int64.ToType()}, proc.Mp()) + res.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(res, 0, []int64{4})) + return res.GetResult(), nil + } + require.True(t, strings.HasPrefix(sql, "select mv_id from "), "ordinary DDL must not introduce DML or retained locks: %s", sql) + require.Contains(t, sql, "account_id=7") + calls++ + if !dependent { + return executor.Result{}, nil + } + res := executor.NewMemResult([]types.Type{types.T_uint64.ToType()}, proc.Mp()) + res.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(res, 0, []uint64{100})) + return res.GetResult(), nil + }, op) + installDropDDLExecutor(t, proc, exec) + rt := moruntime.ServiceRuntime(proc.GetService()) + previous, existed := rt.GetGlobalVariables(mv.RuntimeKey) + marker := &mv.Service{} + rt.SetGlobalVariables(mv.RuntimeKey, marker) + t.Cleanup(func() { + if existed { + rt.SetGlobalVariables(mv.RuntimeKey, previous) + } else { + rt.CompareAndDeleteGlobalVariables(mv.RuntimeKey, marker) + } + }) + c := &Compile{proc: proc, e: eng, db: "db"} + err := c.guardMaterializedViewDDL("db", "source", false) + if dependent { + require.ErrorContains(t, err, "dependent materialized views") + } else { + require.NoError(t, err) + } + require.Equal(t, 1, calls) + }) + } +} + +func TestMaterializedViewDDLReadiness(t *testing.T) { + for _, mode := range []txn.TxnMode{txn.TxnMode_Pessimistic, txn.TxnMode_Optimistic} { + for _, count := range []int64{0, 4} { + for _, dependent := range []bool{false, true} { + for _, tableDDL := range []bool{false, true} { + t.Run(fmt.Sprintf("%d/catalog=%d/dependent=%v/table=%v", mode, count, dependent, tableDDL), func(t *testing.T) { + proc := testutil.NewProcess(t) + proc.Ctx = defines.AttachAccountId(proc.Ctx, 7) + op := mock_frontend.NewMockTxnOperator(gomock.NewController(t)) + op.EXPECT().Txn().Return(txn.TxnMeta{Mode: mode}).AnyTimes() + proc.Base.TxnOperator = op + downstream := 0 + exec := executor.NewMemExecutor2(func(sql string) (executor.Result, error) { + if sql == mv.CatalogReadinessSQL { + r := executor.NewMemResult([]types.Type{types.T_int64.ToType()}, proc.Mp()) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []int64{count})) + return r.GetResult(), nil + } + downstream++ + require.Equal(t, int64(4), count, "pre-migration DDL touched missing MV catalogs") + if strings.HasPrefix(sql, "select mv_id") && dependent { + r := executor.NewMemResult([]types.Type{types.T_uint64.ToType()}, proc.Mp()) + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint64{99})) + return r.GetResult(), nil + } + return executor.Result{}, nil + }, op) + installDropDDLExecutor(t, proc, exec) + rt := moruntime.ServiceRuntime(proc.GetService()) + old, present := rt.GetGlobalVariables(mv.RuntimeKey) + marker := &mv.Service{} + rt.SetGlobalVariables(mv.RuntimeKey, marker) + t.Cleanup(func() { + if present { + rt.SetGlobalVariables(mv.RuntimeKey, old) + } else { + rt.CompareAndDeleteGlobalVariables(mv.RuntimeKey, marker) + } + }) + c := &Compile{proc: proc, db: "db"} + var err error + if tableDDL { + ctrl := gomock.NewController(t) + eng := mock_frontend.NewMockEngine(ctrl) + database := mock_frontend.NewMockDatabase(ctrl) + relation := mock_frontend.NewMockRelation(ctrl) + eng.EXPECT().Database(proc.Ctx, "db", op).Return(database, nil) + database.EXPECT().Relation(proc.Ctx, "source", nil).Return(relation, nil) + relation.EXPECT().GetTableDef(proc.Ctx).Return(&plan.TableDef{TableType: catalog.SystemOrdinaryRel, TblId: 99}) + c.e = eng + err = c.guardMaterializedViewDDL("db", "source", false) + } else { + err = c.guardMaterializedViewDatabaseDDL("db") + } + if count == 4 && dependent { + require.ErrorContains(t, err, "materialized views") + } else { + require.NoError(t, err) + } + if count == 0 { + require.Zero(t, downstream) + } else { + require.Positive(t, downstream) + } + }) + } + } + } + } +} + +func TestMaterializedViewLimitZeroRetainsScanValidation(t *testing.T) { + zero := &plan.Expr{Expr: &plan.Expr_Lit{Lit: &plan.Literal{Value: &plan.Literal_U64Val{U64Val: 0}}}} + for _, sourceStep := range []bool{false, true} { + for _, kind := range []string{catalog.SystemOrdinaryRel, catalog.SystemMaterializedViewRel} { + scan := &plan.Node{NodeId: 0, NodeType: plan.Node_TABLE_SCAN, TableDef: &plan.TableDef{TableType: kind}} + root := &plan.Node{NodeId: 1, NodeType: plan.Node_PROJECT, Limit: zero, Children: []int32{0}} + q := &plan.Query{Nodes: []*plan.Node{scan, root}, Steps: []int32{0, 1}} + if sourceStep { + root.Children = nil + root.SourceStep = []int32{0} + } + c := &Compile{pn: &plan.Plan{Plan: &plan.Plan_Query{Query: q}}} + require.Equal(t, kind != catalog.SystemMaterializedViewRel, c.canUseLiteralLimitZeroFastPath(root)) + root.Children = append(root.Children, 1) // Defensive cycle handling is bounded. + require.Equal(t, kind != catalog.SystemMaterializedViewRel, c.canUseLiteralLimitZeroFastPath(root)) + } + } +} diff --git a/pkg/sql/compile/scheduler.go b/pkg/sql/compile/scheduler.go index e8d5208fb3c87..e0665aacfee6a 100644 --- a/pkg/sql/compile/scheduler.go +++ b/pkg/sql/compile/scheduler.go @@ -28,6 +28,7 @@ import ( "github.com/matrixorigin/matrixone/pkg/clusterservice" "github.com/matrixorigin/matrixone/pkg/common/moerr" moruntime "github.com/matrixorigin/matrixone/pkg/common/runtime" + "github.com/matrixorigin/matrixone/pkg/defines" "github.com/matrixorigin/matrixone/pkg/logutil" "github.com/matrixorigin/matrixone/pkg/pb/metadata" "github.com/matrixorigin/matrixone/pkg/pb/plan" @@ -505,6 +506,9 @@ func (c *Compile) executionRequiresCurrentCN() bool { // exists only at the ingress CN and cannot be sent through a remote scheduler // decision. func (c *Compile) ingressOnlyExecution() bool { + if c != nil && c.proc != nil && defines.MaterializedViewWriteActive(c.proc.Ctx) { + return true + } if c == nil || c.stmt == nil { return false } diff --git a/pkg/sql/compile/sql_executor.go b/pkg/sql/compile/sql_executor.go index 23cefc1cec622..ed203f1c3ef42 100644 --- a/pkg/sql/compile/sql_executor.go +++ b/pkg/sql/compile/sql_executor.go @@ -452,7 +452,7 @@ func (exec *txnExecutor) Exec( receiveAt := time.Now() lower := exec.opts.LowerCaseTableNames() - stmts, err := parsers.Parse(exec.ctx, dialect.MYSQL, sql, lower) + stmts, err := parsers.ParseWithSQLMode(exec.ctx, dialect.MYSQL, sql, lower, exec.opts.ParserSQLMode()) defer func() { for _, stmt := range stmts { stmt.Free() diff --git a/pkg/sql/compile/sql_executor_context.go b/pkg/sql/compile/sql_executor_context.go index 8e5c4aa095390..0aa7043a69c74 100644 --- a/pkg/sql/compile/sql_executor_context.go +++ b/pkg/sql/compile/sql_executor_context.go @@ -708,12 +708,13 @@ func (c *compilerContext) ResolveVariable(varName string, isSystemVar bool, isGl // // Replay may carry the original frontend context; other internal SQL can // carry a partial session resolver on its process (e.g. ALTER TABLE). - // Prefer the former, then forward only explicit precision and DOP settings. + // Prefer the former, then forward only explicit binding and DOP settings. if delegate := c.resolveDelegate(); delegate != nil { return delegate.ResolveVariable(varName, isSystemVar, isGlobalVar) } if isSystemVar && !isGlobalVar && c.proc != nil && (strings.EqualFold(varName, "div_precision_increment") || + strings.EqualFold(varName, "sql_mode") || strings.EqualFold(varName, "max_dop")) { if resolve := c.proc.GetResolveVariableFunc(); resolve != nil { return resolve(varName, isSystemVar, isGlobalVar) diff --git a/pkg/sql/compile/sql_executor_context_test.go b/pkg/sql/compile/sql_executor_context_test.go index b54244e7bf5c8..78c63ec5c71d1 100644 --- a/pkg/sql/compile/sql_executor_context_test.go +++ b/pkg/sql/compile/sql_executor_context_test.go @@ -738,12 +738,15 @@ func TestInternalCompilerPlanConsumesScopedDOP(t *testing.T) { if strings.EqualFold(name, "div_precision_increment") { return int64(10), nil } + if strings.EqualFold(name, "sql_mode") { + return "", nil // Empty SQL mode is a real captured value. + } return nil, errors.New("unexpected variable") }) query := build(compiler, "select cast(1.23 as decimal(10,2)) / cast(3.45 as decimal(10,2))").GetQuery() require.Equal(t, int64(1), query.MaxDop) require.Equal(t, int32(12), query.Nodes[query.Steps[0]].ProjectList[0].Typ.Scale) - for _, name := range []string{"MAX_DOP", "DIV_PRECISION_INCREMENT"} { + for _, name := range []string{"MAX_DOP", "DIV_PRECISION_INCREMENT", "SQL_MODE"} { _, err := compiler.ResolveVariable(name, true, false) require.NoError(t, err) } @@ -755,6 +758,7 @@ func TestInternalCompilerPlanConsumesScopedDOP(t *testing.T) { {"max_dop", false, false}, {"max_dop", true, true}, {"div_precision_increment", false, false}, {"div_precision_increment", true, true}, {"foreign_key_checks", true, false}, + {"sql_mode", false, false}, {"sql_mode", true, true}, } { v, err := compiler.ResolveVariable(tc.name, tc.system, tc.global) require.NoError(t, err) diff --git a/pkg/sql/compile/union_all_lazy_test.go b/pkg/sql/compile/union_all_lazy_test.go index b2058a0ec85e0..ce0ba808feabb 100644 --- a/pkg/sql/compile/union_all_lazy_test.go +++ b/pkg/sql/compile/union_all_lazy_test.go @@ -462,6 +462,20 @@ func TestUnionNestedTopClearsAllocationOwners(t *testing.T) { logicPlan, err := plan2.BuildPlan(compilerCtx, statements[0], false) require.NoError(t, err) c := newLazyUnionAllTestCompile(t) + // This test owns allocation cleanup, not host disk-pressure policy. Keep + // the normal 1 MiB query limit with a private ledger so another fixture's + // explicit spill limit and the local filesystem margin cannot change it. + budget := process.MustNewExecutionResourceBudget(4<<20, uint64(c.proc.GetLim().Size)) + t.Cleanup(budget.Close) + generation, err := budget.OpenGeneration(1) + require.NoError(t, err) + t.Cleanup(func() { + if generation.Used() != 0 || generation.SpillDiskUsed() != 0 || generation.SpillFDUsed() != 0 { + t.Errorf("operators retained execution resources: %+v", generation.Snapshot()) + } + generation.Close() + }) + require.NoError(t, c.proc.SetExecutionResourceBudgetForTesting(generation)) c.isPrepare = false c.pn = logicPlan c.MessageBoard = message.NewMessageBoard() diff --git a/pkg/sql/parsers/dialect/mysql/keywords.go b/pkg/sql/parsers/dialect/mysql/keywords.go index ce91229d53701..514f3674b0d3e 100644 --- a/pkg/sql/parsers/dialect/mysql/keywords.go +++ b/pkg/sql/parsers/dialect/mysql/keywords.go @@ -579,6 +579,12 @@ func init() { "varcharacter": UNUSED, "varying": UNUSED, "virtual": VIRTUAL, + "materialized": MATERIALIZED, + "refresh": REFRESH, + "manual": MANUAL, + "every": EVERY, + "views": VIEWS, + "refreshes": REFRESHES, "view": VIEW, "visible": VISIBLE, "week": WEEK, diff --git a/pkg/sql/parsers/dialect/mysql/materialized_view_test.go b/pkg/sql/parsers/dialect/mysql/materialized_view_test.go new file mode 100644 index 0000000000000..59a9089ae864c --- /dev/null +++ b/pkg/sql/parsers/dialect/mysql/materialized_view_test.go @@ -0,0 +1,72 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mysql + +import ( + "context" + "testing" + + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewSyntax(t *testing.T) { + for _, sql := range []string{ + "create materialized view mv refresh manual as select k,sum(v) as s from t group by k", + "create materialized view if not exists db.mv refresh every interval 2 minute as select * from t", + "refresh materialized view db.mv", + "drop materialized view if exists db.mv", + "alter materialized view db.mv refresh manual", + "alter materialized view db.mv refresh every interval 1 hour", + "show materialized views", + "show materialized view refreshes db.mv", + "show create materialized view db.mv", + } { + t.Run(sql, func(t *testing.T) { + stmts, err := Parse(context.Background(), sql, 1) + require.NoError(t, err) + require.Len(t, stmts, 1) + defer stmts[0].Free() + canonical := tree.String(stmts[0], dialect.MYSQL) + again, err := Parse(context.Background(), canonical, 1) + require.NoError(t, err) + require.Len(t, again, 1) + defer again[0].Free() + require.IsType(t, stmts[0], again[0]) + if c, ok := stmts[0].(*tree.CreateMaterializedView); ok { + require.NotNil(t, c.AsSource) + if c.IfNotExists { + require.Equal(t, int64(120), c.IntervalSeconds) + } + } + }) + } + for _, sql := range []string{ + "create materialized view mv as select * from t", + "create materialized view mv refresh manual as select db.abs(v) from t", + "create materialized view mv refresh every interval 0 second as select * from t", + "alter materialized view mv refresh every interval 366 day", + "create materialized view mv refresh every interval 9223372036854775808 hour as select * from t", + } { + t.Run(sql, func(t *testing.T) { + stmts, err := Parse(context.Background(), sql, 1) + for _, s := range stmts { + s.Free() + } + require.Error(t, err) + }) + } +} diff --git a/pkg/sql/parsers/dialect/mysql/mysql_sql.go b/pkg/sql/parsers/dialect/mysql/mysql_sql.go index f9c4d85b2522a..08e64b569d7d4 100644 --- a/pkg/sql/parsers/dialect/mysql/mysql_sql.go +++ b/pkg/sql/parsers/dialect/mysql/mysql_sql.go @@ -927,24 +927,30 @@ const STORES = 58089 const SETTINGS = 58090 const DUMP = 58091 const METADATA = 58092 -const KILL = 58093 -const BACKUP = 58094 -const FILESYSTEM = 58095 -const PARALLELISM = 58096 -const RESTORE = 58097 -const QUERY_RESULT = 58098 -const RETURNING = 58099 -const ARRAY = 58100 -const WITHIN = 58101 -const PERCENTILE_CONT = 58102 -const PERCENTILE_DISC = 58103 -const ASOF = 58104 -const TOLERANCE = 58105 -const WINDOW = 58106 -const WINDOW_NAME_EMPTY = 58107 -const RESPECT = 58108 -const MEMBER = 58109 -const AUTO_ID_CACHE = 58110 +const MATERIALIZED = 58093 +const REFRESH = 58094 +const MANUAL = 58095 +const EVERY = 58096 +const VIEWS = 58097 +const REFRESHES = 58098 +const KILL = 58099 +const BACKUP = 58100 +const FILESYSTEM = 58101 +const PARALLELISM = 58102 +const RESTORE = 58103 +const QUERY_RESULT = 58104 +const RETURNING = 58105 +const ARRAY = 58106 +const WITHIN = 58107 +const PERCENTILE_CONT = 58108 +const PERCENTILE_DISC = 58109 +const ASOF = 58110 +const TOLERANCE = 58111 +const WINDOW = 58112 +const WINDOW_NAME_EMPTY = 58113 +const RESPECT = 58114 +const MEMBER = 58115 +const AUTO_ID_CACHE = 58116 var yyToknames = [...]string{ "$end", @@ -1714,6 +1720,12 @@ var yyToknames = [...]string{ "SETTINGS", "DUMP", "METADATA", + "MATERIALIZED", + "REFRESH", + "MANUAL", + "EVERY", + "VIEWS", + "REFRESHES", "KILL", "BACKUP", "FILESYSTEM", @@ -1745,9511 +1757,9574 @@ const yyEofCode = 1 const yyErrCode = 2 const yyInitialStackSize = 16 -//line mysql_sql.y:16975 +//line mysql_sql.y:17023 //line yacctab:1 var yyExca = [...]int{ -1, 1, 1, -1, -2, 0, - -1, 153, - 52, 765, - 286, 765, - 313, 772, - 314, 772, - 554, 765, - -2, 805, - -1, 173, - 17, 1016, - 30, 1016, - -2, 1002, - -1, 199, - 284, 1615, - 286, 1435, - -2, 1518, - -1, 276, - 789, 2606, - -2, 638, - -1, 666, - 789, 2734, + -1, 138, + 52, 768, + 286, 768, + 313, 775, + 314, 775, + 554, 768, + -2, 808, + -1, 177, + 17, 1020, + 30, 1020, + -2, 1006, + -1, 204, + 284, 1633, + 286, 1453, + -2, 1536, + -1, 283, + 795, 2630, + -2, 641, + -1, 678, + 795, 2758, + -2, 467, + -1, 738, + 795, 2819, -2, 465, - -1, 726, - 789, 2795, - -2, 463, - -1, 727, - 789, 2796, - -2, 464, - -1, 728, - 789, 2797, + -1, 739, + 795, 2820, -2, 466, - -1, 882, - 549, 805, - 550, 805, - -2, 766, - -1, 954, - 365, 217, - 526, 217, - 527, 217, - -2, 2449, - -1, 1024, - 96, 2178, - -2, 2668, - -1, 1025, - 96, 2199, - -2, 2637, - -1, 1029, - 96, 2200, - -2, 2667, - -1, 1077, - 96, 2099, - -2, 2889, - -1, 1078, - 96, 2100, - -2, 2888, - -1, 1079, - 96, 2101, - -2, 2878, - -1, 1080, - 96, 2849, - -2, 2869, - -1, 1081, - 96, 2850, - -2, 2870, - -1, 1082, - 96, 2851, - -2, 2880, - -1, 1083, - 96, 2852, - -2, 2858, - -1, 1084, - 96, 2853, - -2, 2867, - -1, 1085, - 96, 2854, - -2, 2882, - -1, 1086, - 96, 2855, - -2, 2887, - -1, 1087, - 96, 2856, - -2, 2892, - -1, 1088, - 96, 2857, - -2, 2893, - -1, 1089, - 96, 2174, - -2, 2707, - -1, 1090, - 96, 2175, - -2, 2432, - -1, 1091, - 96, 2176, - -2, 2717, + -1, 740, + 795, 2821, + -2, 468, + -1, 893, + 549, 808, + 550, 808, + -2, 769, + -1, 969, + 365, 219, + 526, 219, + 527, 219, + -2, 2473, + -1, 1039, + 96, 2196, + -2, 2692, + -1, 1040, + 96, 2217, + -2, 2661, + -1, 1044, + 96, 2218, + -2, 2691, -1, 1092, - 96, 2177, - -2, 2443, + 96, 2117, + -2, 2913, + -1, 1093, + 96, 2118, + -2, 2912, -1, 1094, - 96, 2180, - -2, 2451, + 96, 2119, + -2, 2902, + -1, 1095, + 96, 2873, + -2, 2893, -1, 1096, - 96, 2182, - -2, 2742, + 96, 2874, + -2, 2894, + -1, 1097, + 96, 2875, + -2, 2904, -1, 1098, - 96, 2184, - -2, 2475, + 96, 2876, + -2, 2882, -1, 1099, - 96, 2185, - -2, 2402, + 96, 2877, + -2, 2891, + -1, 1100, + 96, 2878, + -2, 2906, -1, 1101, - 96, 2187, - -2, 2754, + 96, 2879, + -2, 2911, -1, 1102, - 96, 2188, - -2, 2753, + 96, 2880, + -2, 2916, -1, 1103, - 96, 2189, - -2, 2561, + 96, 2881, + -2, 2917, -1, 1104, - 96, 2190, - -2, 2663, + 96, 2192, + -2, 2731, -1, 1105, - 96, 2191, - -2, 2581, - -1, 1108, + 96, 2193, + -2, 2456, + -1, 1106, 96, 2194, - -2, 2765, - -1, 1109, + -2, 2741, + -1, 1107, 96, 2195, - -2, 2605, - -1, 1111, - 96, 2197, - -2, 2768, - -1, 1112, + -2, 2467, + -1, 1109, 96, 2198, - -2, 2770, + -2, 2475, + -1, 1111, + 96, 2200, + -2, 2766, -1, 1113, - 96, 2201, - -2, 2777, - -1, 1114, 96, 2202, - -2, 2646, - -1, 1115, + -2, 2499, + -1, 1114, 96, 2203, - -2, 2694, + -2, 2426, -1, 1116, - 96, 2204, - -2, 2657, - -1, 1117, 96, 2205, - -2, 2683, + -2, 2778, + -1, 1117, + 96, 2206, + -2, 2777, + -1, 1118, + 96, 2207, + -2, 2585, + -1, 1119, + 96, 2208, + -2, 2687, + -1, 1120, + 96, 2209, + -2, 2605, + -1, 1123, + 96, 2212, + -2, 2789, + -1, 1124, + 96, 2213, + -2, 2629, + -1, 1126, + 96, 2215, + -2, 2792, + -1, 1127, + 96, 2216, + -2, 2794, -1, 1128, - 96, 2075, - -2, 2883, + 96, 2219, + -2, 2801, -1, 1129, - 96, 2076, - -2, 2884, + 96, 2220, + -2, 2670, -1, 1130, - 96, 2077, - -2, 2885, - -1, 1259, - 138, 2432, - 149, 2432, - 182, 2432, - -2, 2393, - -1, 1408, - 30, 1051, - -2, 978, - -1, 1613, - 17, 1016, - 30, 1016, - -2, 1914, - -1, 1715, - 30, 1051, - -2, 978, - -1, 2052, - 52, 765, - 286, 765, - 313, 772, - 314, 772, - 554, 765, - -2, 805, - -1, 2162, - 96, 2263, - -2, 2665, - -1, 2163, - 96, 2264, - -2, 2666, - -1, 2472, - 17, 1016, - 30, 1016, - -2, 1197, - -1, 2963, - 97, 1291, - -2, 1297, - -1, 2981, - 121, 1513, - 169, 1513, - 217, 1513, - 220, 1513, - 326, 1513, - -2, 1506, - -1, 2984, - 44, 1549, - -2, 1497, - -1, 3497, - 97, 2379, - 183, 2379, - -2, 2648, - -1, 3498, - 97, 2379, - 183, 2379, - -2, 2647, - -1, 3500, - 97, 2375, - 183, 2375, - -2, 2634, - -1, 3501, - 97, 2331, - 183, 2331, - -2, 2639, - -1, 3502, - 97, 2332, - 183, 2332, - -2, 2547, - -1, 3503, - 97, 2333, - 183, 2333, - -2, 2540, - -1, 3504, - 97, 2375, - 183, 2375, - -2, 2417, - -1, 3505, - 97, 2335, - 183, 2335, - -2, 2636, - -1, 3506, - 97, 2336, - 183, 2336, - -2, 2545, - -1, 3507, - 97, 2337, - 183, 2337, - -2, 2539, - -1, 3508, - 97, 2338, - 183, 2338, - -2, 2515, - -1, 3509, - 97, 2379, - 183, 2379, - -2, 2516, - -1, 3510, - 97, 2379, - 183, 2379, - -2, 2517, - -1, 3511, - 97, 2379, - 183, 2379, - -2, 2518, - -1, 3512, - 97, 2379, - 183, 2379, - -2, 2519, - -1, 3513, - 97, 2379, - 183, 2379, - -2, 2520, - -1, 3514, - 97, 2379, - 183, 2379, - -2, 2521, - -1, 3516, - 97, 2347, - 183, 2347, - -2, 2683, - -1, 3517, - 97, 2318, - 183, 2318, - -2, 2668, - -1, 3518, - 97, 2377, - 183, 2377, - -2, 2637, - -1, 3519, - 97, 2377, - 183, 2377, - -2, 2667, - -1, 3520, - 97, 2377, - 183, 2377, - -2, 2452, - -1, 3521, - 97, 2375, - 183, 2375, - -2, 2657, - -1, 3522, - 96, 2298, - 97, 2298, - 172, 2298, - 173, 2298, - 175, 2298, - 183, 2298, - -2, 2416, - -1, 3523, - 96, 2299, - 97, 2299, - 172, 2299, - 173, 2299, - 175, 2299, - 183, 2299, - -2, 2418, - -1, 3524, - 96, 2300, - 97, 2300, - 172, 2300, - 173, 2300, - 175, 2300, - 183, 2300, - -2, 2713, - -1, 3525, - 96, 2302, - 97, 2302, - 172, 2302, - 173, 2302, - 175, 2302, - 183, 2302, - -2, 2638, - -1, 3526, - 96, 2304, - 97, 2304, - 172, 2304, - 173, 2304, - 175, 2304, - 183, 2304, - -2, 2616, - -1, 3527, - 96, 2306, - 97, 2306, - 172, 2306, - 173, 2306, - 175, 2306, - 183, 2306, - -2, 2546, - -1, 3528, - 96, 2308, - 97, 2308, - 172, 2308, - 173, 2308, - 175, 2308, - 183, 2308, - -2, 2501, - -1, 3529, - 96, 2309, - 97, 2309, - 172, 2309, - 173, 2309, - 175, 2309, - 183, 2309, - -2, 2502, - -1, 3530, - 96, 2311, - 97, 2311, - 172, 2311, - 173, 2311, - 175, 2311, - 183, 2311, - -2, 2415, - -1, 3531, - 97, 2382, - 172, 2382, - 173, 2382, - 175, 2382, - 183, 2382, - -2, 2459, - -1, 3532, - 97, 2382, - 172, 2382, - 173, 2382, - 175, 2382, - 183, 2382, - -2, 2476, - -1, 3533, - 97, 2385, - 172, 2385, - 173, 2385, - 175, 2385, - 183, 2385, - -2, 2453, - -1, 3534, - 97, 2385, - 172, 2385, - 173, 2385, - 175, 2385, - 183, 2385, - -2, 2566, + 96, 2221, + -2, 2718, + -1, 1131, + 96, 2222, + -2, 2681, + -1, 1132, + 96, 2223, + -2, 2707, + -1, 1143, + 96, 2093, + -2, 2907, + -1, 1144, + 96, 2094, + -2, 2908, + -1, 1145, + 96, 2095, + -2, 2909, + -1, 1276, + 138, 2456, + 149, 2456, + 182, 2456, + -2, 2411, + -1, 1426, + 30, 1055, + -2, 982, + -1, 1635, + 17, 1020, + 30, 1020, + -2, 1932, + -1, 1737, + 30, 1055, + -2, 982, + -1, 2077, + 52, 768, + 286, 768, + 313, 775, + 314, 775, + 554, 768, + -2, 808, + -1, 2190, + 96, 2281, + -2, 2689, + -1, 2191, + 96, 2282, + -2, 2690, + -1, 2501, + 17, 1020, + 30, 1020, + -2, 1201, + -1, 2997, + 97, 1296, + -2, 1302, + -1, 3016, + 121, 1531, + 169, 1531, + 217, 1531, + 220, 1531, + 326, 1531, + -2, 1524, + -1, 3019, + 44, 1567, + -2, 1515, -1, 3535, - 97, 2382, - 172, 2382, - 173, 2382, - 175, 2382, - 183, 2382, - -2, 2596, + 97, 2397, + 183, 2397, + -2, 2672, -1, 3536, - 97, 2355, - 183, 2355, - -2, 2480, - -1, 3537, - 97, 2356, - 183, 2356, - -2, 2581, + 97, 2397, + 183, 2397, + -2, 2671, -1, 3538, - 97, 2357, - 183, 2357, - -2, 2536, + 97, 2393, + 183, 2393, + -2, 2658, -1, 3539, - 97, 2358, - 183, 2358, - -2, 2582, + 97, 2349, + 183, 2349, + -2, 2663, -1, 3540, - 97, 2359, - 183, 2359, - -2, 2481, + 97, 2350, + 183, 2350, + -2, 2571, -1, 3541, - 97, 2360, - 183, 2360, - -2, 2553, + 97, 2351, + 183, 2351, + -2, 2564, -1, 3542, - 97, 2361, - 183, 2361, - -2, 2552, + 97, 2393, + 183, 2393, + -2, 2441, -1, 3543, - 97, 2362, - 183, 2362, - -2, 2554, + 97, 2353, + 183, 2353, + -2, 2660, -1, 3544, - 97, 2363, - 183, 2363, - -2, 2483, + 97, 2354, + 183, 2354, + -2, 2569, -1, 3545, - 97, 2364, - 183, 2364, - -2, 2482, + 97, 2355, + 183, 2355, + -2, 2563, -1, 3546, - 97, 2365, - 183, 2365, - -2, 2484, + 97, 2356, + 183, 2356, + -2, 2539, -1, 3547, - 97, 2366, - 183, 2366, - -2, 2485, + 97, 2397, + 183, 2397, + -2, 2540, -1, 3548, - 97, 2367, - 183, 2367, - -2, 2486, + 97, 2397, + 183, 2397, + -2, 2541, -1, 3549, - 97, 2368, - 183, 2368, - -2, 2487, + 97, 2397, + 183, 2397, + -2, 2542, -1, 3550, - 97, 2369, - 183, 2369, - -2, 2488, + 97, 2397, + 183, 2397, + -2, 2543, -1, 3551, - 97, 2370, - 183, 2370, - -2, 2489, + 97, 2397, + 183, 2397, + -2, 2544, -1, 3552, - 97, 2371, - 183, 2371, - -2, 2490, - -1, 3553, - 97, 2372, - 183, 2372, - -2, 2491, + 97, 2397, + 183, 2397, + -2, 2545, + -1, 3554, + 97, 2365, + 183, 2365, + -2, 2707, + -1, 3555, + 97, 2336, + 183, 2336, + -2, 2692, + -1, 3556, + 97, 2395, + 183, 2395, + -2, 2661, + -1, 3557, + 97, 2395, + 183, 2395, + -2, 2691, + -1, 3558, + 97, 2395, + 183, 2395, + -2, 2476, + -1, 3559, + 97, 2393, + 183, 2393, + -2, 2681, + -1, 3560, + 96, 2316, + 97, 2316, + 172, 2316, + 173, 2316, + 175, 2316, + 183, 2316, + -2, 2440, + -1, 3561, + 96, 2317, + 97, 2317, + 172, 2317, + 173, 2317, + 175, 2317, + 183, 2317, + -2, 2442, + -1, 3562, + 96, 2318, + 97, 2318, + 172, 2318, + 173, 2318, + 175, 2318, + 183, 2318, + -2, 2737, + -1, 3563, + 96, 2320, + 97, 2320, + 172, 2320, + 173, 2320, + 175, 2320, + 183, 2320, + -2, 2662, + -1, 3564, + 96, 2322, + 97, 2322, + 172, 2322, + 173, 2322, + 175, 2322, + 183, 2322, + -2, 2640, + -1, 3565, + 96, 2324, + 97, 2324, + 172, 2324, + 173, 2324, + 175, 2324, + 183, 2324, + -2, 2570, + -1, 3566, + 96, 2326, + 97, 2326, + 172, 2326, + 173, 2326, + 175, 2326, + 183, 2326, + -2, 2525, + -1, 3567, + 96, 2327, + 97, 2327, + 172, 2327, + 173, 2327, + 175, 2327, + 183, 2327, + -2, 2526, + -1, 3568, + 96, 2329, + 97, 2329, + 172, 2329, + 173, 2329, + 175, 2329, + 183, 2329, + -2, 2439, + -1, 3569, + 97, 2400, + 172, 2400, + 173, 2400, + 175, 2400, + 183, 2400, + -2, 2483, + -1, 3570, + 97, 2400, + 172, 2400, + 173, 2400, + 175, 2400, + 183, 2400, + -2, 2500, + -1, 3571, + 97, 2403, + 172, 2403, + 173, 2403, + 175, 2403, + 183, 2403, + -2, 2477, + -1, 3572, + 97, 2403, + 172, 2403, + 173, 2403, + 175, 2403, + 183, 2403, + -2, 2590, + -1, 3573, + 97, 2400, + 172, 2400, + 173, 2400, + 175, 2400, + 183, 2400, + -2, 2620, + -1, 3574, + 97, 2373, + 183, 2373, + -2, 2504, + -1, 3575, + 97, 2374, + 183, 2374, + -2, 2605, + -1, 3576, + 97, 2375, + 183, 2375, + -2, 2560, + -1, 3577, + 97, 2376, + 183, 2376, + -2, 2606, + -1, 3578, + 97, 2377, + 183, 2377, + -2, 2505, + -1, 3579, + 97, 2378, + 183, 2378, + -2, 2577, + -1, 3580, + 97, 2379, + 183, 2379, + -2, 2576, + -1, 3581, + 97, 2380, + 183, 2380, + -2, 2578, + -1, 3582, + 97, 2381, + 183, 2381, + -2, 2507, + -1, 3583, + 97, 2382, + 183, 2382, + -2, 2506, + -1, 3584, + 97, 2383, + 183, 2383, + -2, 2508, + -1, 3585, + 97, 2384, + 183, 2384, + -2, 2509, + -1, 3586, + 97, 2385, + 183, 2385, + -2, 2510, + -1, 3587, + 97, 2386, + 183, 2386, + -2, 2511, + -1, 3588, + 97, 2387, + 183, 2387, + -2, 2512, -1, 3589, - 121, 1513, - 169, 1513, - 217, 1513, - 220, 1513, - 326, 1513, - -2, 1507, - -1, 3605, - 44, 1550, - -2, 1552, - -1, 3606, - 44, 1551, - -2, 1553, - -1, 3639, - 93, 871, - 183, 871, - -2, 1775, - -1, 4165, - 220, 1513, - 350, 1876, - -2, 1840, - -1, 4221, - 17, 1016, - 30, 1016, - -2, 1914, - -1, 4413, - 44, 1549, - 121, 1513, - 169, 1513, - 217, 1513, - 220, 1513, - -2, 1706, - -1, 4422, - 121, 1513, - 169, 1513, - 217, 1513, - 220, 1513, - -2, 1706, - -1, 4440, - 93, 871, - 183, 871, - -2, 1775, - -1, 4473, - 220, 1513, - 350, 1876, - -2, 1841, - -1, 4684, - 121, 1513, - 169, 1513, - 217, 1513, - 220, 1513, - -2, 1707, - -1, 4728, - 97, 1633, - 183, 1633, - -2, 1513, - -1, 4949, - 102, 1206, - -2, 2400, - -1, 4955, - 97, 1633, - 183, 1633, - -2, 1513, - -1, 5240, - 97, 1637, - 183, 1637, - -2, 1513, - -1, 5312, - 97, 1638, - 183, 1638, - -2, 1513, + 97, 2388, + 183, 2388, + -2, 2513, + -1, 3590, + 97, 2389, + 183, 2389, + -2, 2514, + -1, 3591, + 97, 2390, + 183, 2390, + -2, 2515, + -1, 3628, + 121, 1531, + 169, 1531, + 217, 1531, + 220, 1531, + 326, 1531, + -2, 1525, + -1, 3644, + 44, 1568, + -2, 1570, + -1, 3645, + 44, 1569, + -2, 1571, + -1, 3678, + 93, 875, + 183, 875, + -2, 1793, + -1, 4207, + 220, 1531, + 350, 1894, + -2, 1858, + -1, 4263, + 17, 1020, + 30, 1020, + -2, 1932, + -1, 4457, + 44, 1567, + 121, 1531, + 169, 1531, + 217, 1531, + 220, 1531, + -2, 1724, + -1, 4466, + 121, 1531, + 169, 1531, + 217, 1531, + 220, 1531, + -2, 1724, + -1, 4484, + 93, 875, + 183, 875, + -2, 1793, + -1, 4517, + 220, 1531, + 350, 1894, + -2, 1859, + -1, 4729, + 121, 1531, + 169, 1531, + 217, 1531, + 220, 1531, + -2, 1725, + -1, 4773, + 97, 1651, + 183, 1651, + -2, 1531, + -1, 4999, + 102, 1210, + -2, 2424, + -1, 5005, + 97, 1651, + 183, 1651, + -2, 1531, + -1, 5290, + 97, 1655, + 183, 1655, + -2, 1531, + -1, 5362, + 97, 1656, + 183, 1656, + -2, 1531, } const yyPrivate = 57344 -const yyLast = 89990 +const yyLast = 90660 var yyAct = [...]int{ - 990, 5369, 5358, 965, 5422, 5388, 5354, 5361, 4946, 5337, - 264, 5406, 1992, 5378, 5353, 5250, 3690, 992, 5244, 4957, - 3823, 2141, 4514, 5188, 975, 5243, 4955, 4578, 5254, 3970, - 4195, 5112, 4176, 4022, 5177, 3206, 4268, 5019, 5255, 4763, - 1991, 4841, 4490, 1878, 4947, 3260, 3476, 3705, 4790, 4888, - 4024, 2979, 5036, 4573, 4269, 1652, 781, 2216, 4940, 4954, - 4266, 1497, 5078, 4958, 4388, 1895, 4673, 5189, 5191, 3708, - 3596, 1021, 4717, 1258, 803, 4918, 4586, 4524, 4396, 1504, - 3860, 2203, 3472, 4158, 1932, 4686, 820, 830, 4402, 840, - 2200, 4445, 840, 3074, 4163, 1894, 3416, 3391, 3642, 3390, - 251, 5, 4474, 4680, 3608, 4093, 1472, 1265, 3474, 4702, - 3597, 2144, 4348, 4092, 4074, 967, 4656, 1267, 171, 1468, - 3598, 4249, 3253, 3384, 2473, 2998, 2599, 3822, 4078, 4386, - 3824, 2596, 917, 3721, 249, 2443, 1896, 3789, 4160, 1451, - 4191, 4423, 4170, 3679, 3819, 3673, 3299, 2466, 3492, 1414, - 834, 16, 4218, 3484, 3677, 2648, 908, 3671, 2094, 2770, - 16, 3443, 4338, 2199, 3575, 3810, 4056, 4043, 957, 912, - 2222, 4054, 3201, 4169, 1871, 3088, 4095, 4094, 4105, 2002, - 3004, 958, 3019, 3007, 2337, 1175, 4090, 2999, 832, 38, - 3590, 1980, 1975, 1800, 2923, 1768, 1908, 1984, 38, 4002, - 238, 820, 1219, 962, 2813, 3233, 826, 2653, 2766, 3490, - 2922, 3212, 2592, 3563, 3557, 3298, 3176, 2765, 3696, 3075, - 2487, 3078, 3611, 2474, 3646, 2613, 3018, 892, 4, 2475, - 1798, 3053, 3645, 260, 7, 781, 2467, 2981, 1331, 835, - 32, 3002, 2406, 259, 6, 1965, 2996, 2217, 820, 32, - 3723, 2136, 2005, 1933, 1880, 2767, 3009, 1887, 1717, 2740, - 3006, 966, 802, 2809, 264, 1856, 264, 1850, 1321, 1322, - 2971, 956, 1842, 2210, 2925, 2449, 820, 2433, 2178, 976, - 2127, 1997, 1649, 1449, 2974, 1249, 26, 1432, 1252, 2093, - 2015, 958, 2670, 905, 1940, 2397, 836, 44, 245, 1812, - 1486, 1817, 1274, 2401, 1852, 1251, 44, 2135, 1805, 1855, - 1139, 2405, 1454, 1218, 1140, 1743, 1840, 2427, 1801, 1138, - 244, 1136, 2223, 1507, 914, 250, 1482, 915, 1508, 3177, - 1141, 821, 86, 5338, 237, 1216, 54, 42, 1300, 1799, - 911, 78, 1198, 1211, 780, 877, 2745, 154, 81, 5, - 839, 29, 87, 80, 27, 28, 19, 10, 1269, 5063, - 2479, 1653, 1576, 76, 1577, 1575, 1576, 1135, 1577, 1575, - 1318, 1576, 964, 1577, 1575, 4914, 4282, 3440, 3440, 4013, - 3440, 4443, 831, 17, 2454, 2458, 2459, 2460, 2455, 2465, - 2456, 2462, 17, 4130, 2457, 4012, 2463, 3875, 1317, 16, - 1319, 833, 15, 2365, 3874, 2782, 1744, 1415, 4636, 4405, - 1416, 15, 812, 4261, 16, 3332, 16, 3239, 3237, 810, - 3236, 3234, 1745, 2354, 1947, 806, 807, 1943, 1314, 1313, - 248, 808, 3417, 4833, 4139, 3385, 2886, 38, 2997, 4446, - 1271, 809, 844, 3261, 805, 2921, 1415, 1738, 3252, 1464, - 1465, 1466, 38, 1854, 38, 1695, 5166, 1463, 2454, 2458, - 2459, 2460, 2455, 2465, 2456, 2462, 2695, 2140, 2457, 2006, - 2463, 1462, 3644, 5090, 4287, 2729, 3694, 1312, 1912, 2733, - 1314, 2734, 7, 1828, 1314, 1772, 4421, 2696, 32, 1603, - 3207, 1609, 6, 4014, 2927, 4620, 2011, 4010, 3178, 2937, - 2361, 1747, 3988, 32, 1132, 32, 3985, 1606, 1608, 1602, - 5349, 1607, 1589, 1588, 1598, 1599, 1600, 1601, 1591, 1592, - 1593, 1594, 1595, 1596, 1597, 1590, 1524, 9, 1604, 2348, - 2917, 1354, 1726, 1945, 4571, 3855, 2454, 2458, 2459, 2460, - 2455, 2465, 2456, 2462, 2833, 44, 2457, 3853, 2463, 3995, - 3993, 2658, 1264, 4755, 1960, 963, 1603, 1262, 1609, 3986, - 44, 3983, 44, 5252, 5251, 1162, 4275, 1159, 1263, 1266, - 5031, 4849, 4842, 4574, 1606, 1608, 1602, 4267, 1607, 1589, - 1588, 1598, 1599, 1600, 1601, 1591, 1592, 1593, 1594, 1595, - 1596, 1597, 1590, 5194, 3997, 1604, 2454, 2458, 2459, 2460, - 2455, 2465, 2456, 2462, 1076, 3001, 2457, 1576, 2463, 1577, - 1575, 2446, 1137, 2345, 1132, 2454, 2458, 2459, 2460, 2455, - 2465, 2456, 2462, 1647, 3948, 2457, 4041, 2463, 3152, 2677, - 2722, 17, 1576, 3117, 1577, 1575, 5393, 5046, 5345, 4625, - 4860, 2067, 4857, 5043, 1150, 2009, 17, 4900, 17, 4377, - 15, 3365, 2944, 4623, 1455, 5124, 1909, 1753, 1751, 1750, - 4372, 4044, 2961, 2201, 2202, 15, 2008, 15, 1372, 1373, - 1334, 1163, 1160, 1460, 1276, 1461, 3943, 910, 2548, 1794, - 5104, 946, 3817, 2975, 948, 2780, 3197, 1572, 1354, 947, - 2374, 1362, 1366, 1368, 1370, 1375, 2372, 1380, 1376, 1377, - 1378, 1379, 3829, 3830, 1357, 1358, 1359, 1360, 1332, 1333, - 1363, 2587, 1335, 3859, 1336, 1338, 1339, 1340, 1341, 1337, - 1342, 1343, 1344, 1345, 1346, 1353, 1355, 1347, 1348, 1349, - 1350, 1351, 1352, 1381, 1382, 1383, 1384, 1385, 1386, 1387, - 1388, 1390, 1389, 1391, 1392, 1393, 1394, 1395, 1396, 1397, - 1398, 1365, 1367, 1369, 1371, 1374, 1151, 3198, 2609, 2576, - 2577, 3987, 946, 3984, 4902, 948, 2085, 1760, 1157, 946, - 947, 3828, 948, 3184, 2575, 1459, 3183, 947, 3158, 3185, - 2379, 2380, 3157, 201, 246, 200, 233, 202, 3311, 3310, - 1494, 1163, 1356, 1160, 4180, 5310, 1946, 1944, 1552, 4455, - 1123, 1553, 1122, 1124, 1125, 820, 1126, 1127, 3559, 4021, - 1520, 1505, 1506, 1521, 2128, 820, 2258, 2132, 3560, 1857, - 820, 1859, 1418, 3254, 901, 1372, 1373, 1334, 2143, 1555, - 2563, 1503, 3998, 4178, 2109, 1502, 1505, 1506, 5258, 5259, - 1565, 2131, 840, 840, 1446, 5198, 820, 820, 1362, 1366, - 1368, 1370, 1375, 2461, 1380, 1376, 1377, 1378, 1379, 239, - 1570, 1357, 1358, 1359, 1360, 1332, 1333, 1363, 3558, 1335, - 1324, 1336, 1338, 1339, 1340, 1341, 1337, 1342, 1343, 1344, - 1345, 1346, 1353, 1355, 1347, 1348, 1349, 1350, 1351, 1352, - 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1390, 1389, - 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1365, 1367, - 1369, 1371, 1374, 1161, 1523, 1158, 201, 246, 200, 233, - 202, 1409, 2083, 1261, 5198, 5294, 1260, 2461, 1237, 5197, - 3040, 1408, 2459, 2460, 5196, 3471, 2893, 2064, 1501, 3467, - 1498, 5195, 1498, 5197, 5293, 5288, 4868, 1269, 5034, 1356, - 1410, 3861, 1737, 1835, 1550, 5210, 820, 5196, 5292, 5195, - 5291, 5179, 2364, 5182, 5062, 1474, 4859, 5340, 5341, 4845, - 2133, 5037, 5038, 5039, 5040, 1622, 1471, 3862, 4270, 3863, - 4913, 1615, 4294, 3905, 1480, 3439, 1416, 2781, 3996, 2147, - 2375, 1490, 239, 4627, 2130, 4270, 2373, 3283, 1416, 5179, - 1510, 1511, 1913, 1513, 1514, 2461, 1838, 1516, 3866, 1829, - 3469, 5074, 1416, 1773, 3464, 1419, 1551, 2784, 3743, 2593, - 3171, 4291, 2697, 1418, 1492, 2583, 3876, 1154, 2123, 1271, - 3873, 1422, 1426, 4070, 1429, 2818, 2744, 5257, 4387, 4015, - 2928, 2776, 1428, 3566, 1435, 1438, 4665, 247, 3160, 201, - 246, 1416, 2969, 4394, 3602, 201, 246, 200, 233, 202, - 2607, 2608, 3901, 3811, 1314, 2461, 2084, 2704, 1314, 1314, - 817, 1314, 4904, 4905, 3481, 1568, 1569, 4503, 1314, 1532, - 1314, 4715, 5212, 3324, 2461, 2464, 4624, 1269, 2062, 3899, - 2783, 3468, 3433, 4068, 4142, 3465, 1563, 1564, 1554, 1567, - 3604, 230, 1155, 1204, 1230, 1228, 4699, 1229, 1545, 3115, - 1522, 1547, 1540, 3802, 2129, 1439, 1440, 1779, 5023, 4572, - 3261, 3151, 1364, 3154, 3854, 3595, 3162, 1264, 4867, 2546, - 4910, 239, 1407, 4662, 3153, 1233, 4869, 4621, 1656, 1548, - 4075, 1777, 4064, 1263, 2147, 1605, 2062, 4065, 4066, 4421, - 2146, 2145, 3163, 3164, 1740, 1742, 5085, 1746, 1411, 2464, - 5086, 5089, 5088, 4067, 4076, 1745, 3442, 3174, 1745, 1271, - 1488, 1489, 812, 1764, 1562, 3599, 801, 1767, 2058, 810, - 247, 2586, 4533, 1156, 1776, 806, 807, 4988, 4858, 4182, - 2010, 808, 1444, 1445, 4193, 4194, 1483, 1487, 1487, 1487, - 4192, 809, 3235, 1515, 4389, 3994, 1518, 1519, 1238, 5066, - 2683, 1928, 1605, 820, 820, 820, 1752, 1749, 1219, 4529, - 4891, 1525, 1526, 1483, 1483, 1509, 1827, 1948, 1512, 4690, - 4637, 820, 1137, 1834, 1529, 3470, 1841, 2464, 4411, 3466, - 820, 1456, 4255, 1712, 781, 781, 1716, 1505, 1506, 4089, - 1531, 3562, 4106, 4626, 781, 781, 1715, 1623, 1882, 1882, - 1234, 820, 2547, 4951, 1541, 5108, 1329, 949, 950, 951, - 952, 953, 5092, 4062, 4903, 3612, 4930, 1719, 4352, 1364, - 4354, 2983, 1425, 1427, 1437, 1436, 1505, 1506, 838, 1164, - 1543, 840, 1493, 803, 1778, 842, 4076, 2464, 1417, 1936, - 841, 3815, 1884, 1546, 1549, 2146, 2145, 4184, 2977, 4185, - 4187, 4186, 4509, 247, 4003, 264, 2464, 5079, 3605, 247, - 1759, 4515, 1236, 5137, 781, 2956, 1542, 1153, 5113, 1557, - 4177, 3710, 1558, 4629, 4630, 4631, 2792, 2794, 2795, 4188, - 4522, 4366, 1617, 1618, 1619, 1620, 1621, 1481, 949, 950, - 951, 952, 953, 4897, 79, 949, 950, 951, 952, 953, - 1560, 4645, 2153, 2157, 2158, 4363, 1836, 2788, 2790, 2791, - 1889, 4034, 3150, 2154, 1770, 1771, 4535, 4534, 1774, 1905, - 1906, 5073, 1782, 1784, 1785, 1786, 1787, 4751, 1789, 5416, - 3706, 3707, 1793, 3710, 1839, 1668, 1669, 3128, 3607, 2461, - 1988, 3601, 4197, 4076, 1203, 1993, 3127, 1139, 1544, 4365, - 4589, 3170, 2155, 1442, 1479, 1207, 2007, 1208, 3148, 3149, - 4071, 838, 3572, 1329, 201, 246, 200, 233, 202, 2594, - 1876, 1877, 2078, 2059, 3565, 201, 246, 200, 233, 202, - 1722, 4198, 2033, 4740, 1723, 902, 5211, 1264, 1232, 3812, - 3902, 2063, 1710, 4952, 1867, 1816, 4746, 2065, 1866, 2062, - 4906, 2036, 1720, 1263, 1530, 16, 4931, 4183, 1711, 1478, - 3081, 1748, 2776, 1496, 1495, 2000, 3773, 1882, 1477, 3744, - 5114, 3745, 3746, 1841, 4919, 1556, 5242, 79, 830, 3569, - 3570, 1430, 4666, 4085, 4159, 2584, 4317, 2003, 2124, 1657, - 239, 5192, 829, 38, 3568, 4960, 3435, 3118, 1806, 2108, - 5054, 828, 5055, 4424, 3073, 1996, 1841, 4569, 1769, 2066, - 910, 2117, 2117, 1498, 1841, 1561, 1841, 1841, 1781, 3098, - 5176, 1853, 1861, 1863, 3055, 3057, 4063, 1882, 1755, 1882, - 1418, 904, 1874, 1875, 903, 1998, 1610, 1559, 4349, 1537, - 1804, 1977, 1978, 1811, 32, 1925, 1807, 1808, 5381, 1231, - 838, 4222, 1892, 1783, 1226, 1899, 1893, 4193, 4194, 1983, - 4432, 1227, 1987, 4202, 1865, 2079, 1955, 1986, 1757, 4449, - 2070, 2073, 2074, 2077, 1890, 3320, 3189, 1898, 1966, 3090, - 1612, 1611, 2112, 3156, 2041, 3073, 3092, 2099, 2091, 2092, - 3113, 2926, 1266, 1907, 2773, 2582, 1979, 2570, 812, 5056, - 1994, 44, 1949, 1882, 2107, 2101, 2102, 2110, 2111, 1766, - 3606, 3213, 3214, 1788, 3453, 4196, 79, 4547, 2982, 3609, - 2019, 1418, 2220, 2793, 2023, 2024, 1780, 2114, 1937, 3080, - 1938, 1923, 4238, 4224, 3082, 2957, 3904, 1615, 2271, 1919, - 4086, 1792, 5052, 3091, 1536, 2261, 2262, 2263, 1791, 2156, - 1790, 5054, 804, 5055, 2789, 1239, 4959, 846, 2277, 2001, - 845, 2278, 3796, 4380, 2113, 2785, 2786, 2252, 2253, 5048, - 3090, 2257, 2120, 2045, 4754, 1169, 3073, 3092, 247, 2272, - 4189, 3084, 2299, 2300, 824, 825, 5241, 17, 3083, 247, - 2562, 4297, 2279, 1206, 2281, 2356, 2282, 2283, 2284, 2056, - 815, 2021, 816, 4295, 5382, 1193, 15, 2025, 2119, 1220, - 3087, 3741, 2332, 2810, 2031, 4747, 4748, 4339, 4742, 1192, - 4449, 2089, 4741, 2289, 2291, 2290, 1418, 3056, 2552, 2550, - 2050, 201, 246, 2551, 3091, 1982, 3281, 2139, 2366, 1173, - 1139, 2561, 2369, 1269, 1171, 1170, 4281, 820, 820, 820, - 5056, 3774, 3776, 3777, 3778, 3775, 2384, 2386, 1815, 2387, - 3461, 2390, 2391, 3097, 2948, 2394, 2051, 3095, 803, 2398, - 2049, 2047, 2343, 2402, 2159, 1882, 2408, 2409, 1754, 2411, - 1841, 2089, 2100, 2089, 820, 2048, 2039, 1882, 2044, 2038, - 2043, 2037, 1763, 820, 2090, 2106, 1483, 2382, 2335, 2255, - 2095, 1219, 2097, 2098, 2444, 2121, 2122, 239, 2333, 2096, - 1487, 2288, 2469, 2469, 1827, 2469, 2042, 2105, 1769, 2480, - 2481, 820, 820, 1487, 2545, 1271, 4433, 1844, 2402, 2556, - 3880, 2338, 2080, 2081, 4356, 2040, 1172, 1882, 2567, 2568, - 2116, 2118, 2342, 1827, 3085, 781, 902, 201, 246, 2383, - 2134, 1981, 2357, 5379, 5380, 2138, 1176, 2204, 4280, 781, - 246, 1882, 2950, 2949, 201, 246, 200, 233, 202, 1222, - 1223, 1224, 2180, 3454, 4009, 1963, 2947, 1958, 1964, 1961, - 1962, 1756, 1758, 5049, 1761, 1762, 2497, 5190, 2711, 2708, - 2362, 2014, 1967, 1968, 1969, 1970, 1971, 1972, 3604, 2381, - 1165, 2625, 2627, 3140, 1166, 820, 2402, 1882, 2499, 2634, - 1275, 820, 908, 908, 4703, 2398, 4190, 5022, 2641, 838, - 2643, 2644, 2645, 239, 2716, 2717, 2649, 5418, 201, 246, - 838, 2020, 1269, 264, 2086, 239, 264, 264, 2412, 264, - 239, 4245, 904, 1240, 3640, 903, 1845, 2410, 2437, 1286, - 5463, 1235, 2017, 2854, 2358, 5186, 2554, 2853, 2392, 2393, - 2471, 2016, 2477, 2176, 2177, 2399, 2400, 2572, 2346, 2194, - 2195, 2270, 5462, 2198, 5164, 2610, 2413, 2414, 2415, 2434, - 201, 246, 2426, 2285, 2286, 79, 2647, 2341, 1574, 2344, - 3619, 2615, 2616, 2973, 2137, 247, 79, 1843, 2602, 2603, - 2692, 4244, 1473, 2703, 2436, 2062, 2142, 2685, 201, 246, - 2017, 2017, 1473, 2017, 1271, 246, 1264, 201, 246, 2016, - 2016, 2334, 2016, 4240, 1537, 2336, 2579, 2588, 2581, 2089, - 2396, 2689, 1263, 5447, 5049, 2667, 1574, 781, 5050, 2600, - 2601, 2089, 4661, 1574, 2630, 2355, 5445, 2359, 2910, 820, - 2636, 2444, 2363, 820, 2558, 1268, 2691, 4414, 1574, 4277, - 2726, 1268, 2728, 3487, 1844, 1901, 2732, 2657, 4116, 2595, - 2660, 2661, 2571, 2663, 2737, 2738, 2739, 2633, 2772, 2743, - 1574, 1841, 2681, 16, 239, 2425, 16, 16, 2611, 16, - 239, 2089, 2435, 239, 3764, 3765, 3179, 2218, 5453, 3488, - 3489, 5437, 3641, 2559, 5433, 5429, 2439, 2440, 2428, 2445, - 1841, 247, 2432, 2428, 2441, 2089, 892, 1882, 2769, 1574, - 902, 38, 4335, 247, 38, 38, 2972, 38, 247, 1473, - 2126, 2553, 1574, 2573, 2164, 2165, 2166, 2167, 2168, 2169, - 2170, 2171, 2172, 2173, 2174, 2175, 2557, 2698, 2565, 2032, - 2753, 5403, 201, 246, 2196, 2197, 1169, 4293, 4129, 4245, - 2578, 2089, 2580, 2674, 2589, 2029, 2030, 2727, 3112, 3048, - 2730, 2731, 32, 3048, 2735, 32, 32, 5431, 32, 1576, - 2221, 1577, 1575, 1845, 2797, 2256, 2720, 5103, 2747, 2748, - 5430, 5430, 247, 2772, 201, 246, 2620, 5400, 2750, 2751, - 2619, 2736, 2350, 1275, 2646, 2637, 2638, 5397, 2280, 2631, - 2639, 2705, 2706, 2624, 2632, 2755, 904, 3319, 2618, 903, - 1168, 1713, 1802, 2712, 2654, 1171, 1170, 1574, 239, 44, - 5395, 5390, 44, 44, 1843, 44, 3763, 5404, 3940, 3048, - 1999, 1537, 2407, 1576, 247, 1577, 1575, 2682, 3641, 2686, - 2758, 4205, 4203, 5375, 2421, 3978, 2760, 2672, 2762, 3579, - 3585, 3586, 3587, 3580, 3584, 3581, 3583, 3582, 2763, 4151, - 239, 2017, 247, 2687, 4148, 4050, 5329, 2125, 247, 2243, - 2016, 247, 1576, 5401, 1577, 1575, 4245, 5314, 1537, 2690, - 1269, 5274, 5273, 5398, 5272, 2864, 3975, 2709, 2867, 2707, - 2869, 2901, 2752, 2710, 2566, 2713, 2899, 2876, 1144, 1145, - 1146, 1147, 1308, 1309, 1310, 17, 2778, 5391, 17, 17, - 2889, 17, 2715, 1576, 4047, 1577, 1575, 1142, 1576, 4001, - 1577, 1575, 2719, 1576, 15, 1577, 1575, 15, 15, 5315, - 15, 3979, 1144, 1145, 1146, 1147, 2772, 1307, 2929, 2930, - 1304, 2932, 2933, 3625, 3436, 2936, 3319, 1534, 1167, 5267, - 2742, 1142, 5330, 820, 1841, 820, 1841, 5260, 1535, 838, - 2746, 2089, 1271, 5315, 2137, 2647, 2951, 5275, 1574, 1868, - 1574, 3258, 3976, 2958, 2959, 5238, 957, 2902, 2771, 5138, - 820, 820, 2900, 1904, 3200, 2970, 2764, 2816, 1713, 2574, - 5135, 3081, 3084, 2759, 820, 820, 820, 3067, 2892, 2894, - 2895, 2896, 2920, 2898, 2749, 2775, 247, 2907, 2906, 2908, - 2756, 2863, 1576, 2757, 1577, 1575, 5102, 3005, 3005, 3011, - 2796, 1487, 2909, 3081, 3084, 79, 3020, 1827, 1827, 1827, - 1827, 1827, 1827, 1827, 1827, 2778, 5096, 2862, 1535, 2811, - 2861, 2798, 2180, 2828, 2830, 2718, 2803, 2180, 247, 2469, - 4764, 4765, 4766, 4770, 4768, 4769, 4771, 4772, 4773, 4774, - 4767, 5239, 4979, 2820, 2827, 2778, 4978, 1148, 1469, 5013, - 2292, 3939, 1470, 2295, 2296, 2297, 2828, 3104, 2301, 2302, - 2303, 2304, 2306, 2307, 2308, 2309, 2310, 2311, 2312, 2313, - 2315, 2316, 2317, 2318, 2319, 1576, 2239, 1577, 1575, 2771, - 3059, 1148, 5103, 2236, 3296, 4975, 2605, 2238, 2235, 2237, - 2241, 2242, 2941, 2569, 2943, 2240, 1576, 4974, 1577, 1575, - 4973, 1810, 1574, 201, 246, 200, 233, 202, 1301, 1302, - 1303, 1306, 1174, 1305, 4972, 1269, 2799, 2800, 4971, 2207, - 4827, 2804, 2805, 1576, 1882, 1577, 1575, 4449, 2778, 4953, - 820, 2117, 2778, 3111, 2826, 3085, 1576, 4916, 1577, 1575, - 3080, 3073, 3079, 4443, 3076, 3082, 4885, 1576, 4882, 1577, - 1575, 781, 781, 4722, 4721, 3669, 3068, 4436, 3936, 1418, - 3845, 2912, 2913, 3643, 3624, 1882, 820, 3085, 3449, 1139, - 1424, 2828, 3080, 3073, 3079, 3322, 3076, 3082, 3008, 239, - 3321, 4647, 3412, 2828, 201, 246, 2828, 2065, 2915, 3208, - 3209, 3282, 2965, 4646, 2931, 2905, 820, 1271, 2935, 3083, - 2828, 803, 4542, 4393, 2828, 3168, 2824, 2849, 1936, 2832, - 2761, 3224, 2714, 3226, 4825, 4471, 264, 4470, 4466, 2652, - 2990, 2360, 2666, 2828, 3070, 3072, 3071, 2962, 3093, 3094, - 4460, 3083, 1574, 4457, 3016, 1275, 3021, 4430, 4328, 4723, - 3016, 3219, 3155, 2246, 2247, 2248, 2249, 2250, 2251, 2244, - 2245, 4324, 3005, 3005, 3267, 1144, 1145, 1146, 1147, 4213, - 239, 3278, 4111, 3927, 2012, 3047, 3871, 4151, 1631, 1441, - 1404, 3186, 1399, 3187, 1656, 3288, 3869, 3012, 3013, 4148, - 2815, 2814, 3629, 3627, 2989, 3077, 3621, 3410, 2062, 2994, - 3294, 3397, 3192, 3193, 3297, 3300, 2435, 2435, 3041, 3389, - 3302, 2801, 2802, 4471, 4467, 1882, 2806, 2807, 3180, 3022, - 3023, 3024, 3025, 3026, 3027, 3028, 4151, 3077, 4540, 4148, - 3361, 3362, 3316, 1574, 4329, 2769, 3046, 3355, 3334, 1953, - 1952, 3291, 1882, 1484, 1882, 3211, 2604, 4325, 1590, 1418, - 4134, 3249, 3247, 3066, 3245, 4214, 3243, 3333, 3622, 1574, - 3229, 3896, 3628, 5093, 1380, 1376, 1377, 1378, 1379, 3049, - 3015, 3360, 3622, 3359, 3358, 3356, 16, 247, 3630, 3628, - 1269, 2911, 3622, 1574, 2872, 3262, 2871, 1574, 2204, 2852, - 2843, 3354, 2842, 2841, 2829, 1574, 2777, 2104, 1882, 1418, - 2559, 1612, 1611, 3368, 2026, 2388, 3169, 3175, 4107, 5094, - 3181, 4595, 4564, 5419, 38, 4704, 3369, 4932, 3293, 1872, - 3377, 5405, 3295, 3910, 1574, 1882, 3307, 3016, 4427, 3195, - 1873, 4425, 3312, 3196, 1148, 1517, 3306, 3250, 3248, 3199, - 3244, 3363, 3244, 3008, 2389, 1870, 3313, 3314, 1610, 1861, - 1863, 1610, 5402, 1435, 1438, 3048, 3016, 3234, 247, 3357, - 5399, 4705, 1271, 5344, 3413, 32, 1485, 2910, 3378, 2564, - 1574, 3223, 1574, 3216, 4428, 1574, 1574, 4426, 1574, 1574, - 2828, 3303, 2778, 3317, 3284, 3285, 5064, 3286, 3287, 2655, - 2027, 4108, 1612, 1611, 1429, 1612, 1611, 1469, 3444, 3446, - 1469, 1470, 3887, 3263, 1470, 3451, 2260, 2259, 3455, 4933, - 3255, 5005, 2260, 2259, 5004, 820, 820, 820, 4915, 2075, - 3266, 3276, 44, 3265, 1439, 1591, 1592, 1593, 1594, 1595, - 1596, 1597, 1590, 4853, 3256, 1418, 3554, 4109, 3259, 4594, - 1469, 3392, 3383, 1882, 1470, 3387, 1841, 3398, 959, 4823, - 3290, 1869, 4788, 1841, 2556, 4934, 4744, 3348, 4743, 3351, - 3386, 3325, 4669, 3005, 3330, 3415, 3393, 2071, 3419, 3305, - 3421, 3422, 3304, 3366, 4437, 3429, 1593, 1594, 1595, 1596, - 1597, 1590, 4404, 2191, 4246, 4236, 3343, 3636, 3639, 4227, - 3318, 5231, 4215, 3323, 4153, 4150, 2089, 4080, 2089, 2188, - 2190, 2187, 3805, 2189, 3804, 3631, 3626, 3430, 17, 4259, - 3577, 3617, 1421, 1423, 3441, 3331, 3289, 3191, 838, 1827, - 2934, 1827, 2701, 2700, 2305, 3494, 2699, 15, 3632, 3633, - 2298, 3675, 3681, 3335, 3336, 3353, 2022, 3591, 3338, 3339, - 1469, 1418, 2076, 2018, 1470, 1657, 3364, 1796, 1795, 3613, - 3700, 1420, 1576, 3315, 1577, 1575, 3345, 3228, 3711, 1418, - 4446, 3713, 3714, 3715, 1418, 1418, 1418, 2117, 5230, 5098, - 1418, 3726, 4026, 3727, 3728, 2211, 3729, 2821, 3731, 3732, - 2186, 3594, 1802, 4023, 79, 5, 3479, 2211, 1469, 3726, - 2072, 1803, 1470, 1437, 1436, 3846, 2183, 2185, 2182, 5290, - 2184, 2497, 2469, 1576, 3573, 1577, 1575, 1576, 4758, 1577, - 1575, 3592, 4026, 1941, 4262, 2655, 3786, 4941, 3238, 1576, - 5279, 1577, 1575, 2499, 4884, 1803, 3684, 2429, 4260, 1576, - 4883, 1577, 1575, 781, 1575, 16, 1882, 3428, 1882, 1576, - 4733, 1577, 1575, 1577, 1575, 2556, 3692, 4757, 3347, 1418, - 1418, 3341, 4023, 3342, 2426, 1576, 4112, 1577, 1575, 1576, - 1882, 1577, 1575, 1941, 3431, 3432, 1803, 3733, 3230, 3716, - 3826, 3730, 3703, 38, 1576, 3701, 1577, 1575, 3376, 3806, - 4732, 820, 1633, 2993, 3576, 3571, 1418, 5157, 5158, 3842, - 4025, 5266, 3600, 1827, 3616, 1632, 1576, 2089, 1577, 1575, - 3929, 264, 2845, 3791, 3615, 1942, 264, 3202, 3203, 2137, - 1315, 1316, 5226, 3635, 3638, 1320, 5155, 5156, 7, 3808, - 5161, 3651, 3652, 5160, 32, 3328, 3649, 3650, 6, 5415, - 3634, 5159, 1936, 5317, 5009, 5010, 3555, 3556, 4670, 4671, - 4663, 3424, 3661, 3425, 3699, 3270, 3867, 3666, 3667, 3668, - 3662, 3603, 5154, 3878, 3663, 3269, 2275, 3683, 3686, 3797, - 1576, 5153, 1577, 1575, 3695, 3928, 3698, 3300, 3697, 3697, - 3702, 2276, 3914, 3697, 2844, 2218, 3494, 1576, 5152, 1577, - 1575, 44, 3827, 3719, 5151, 1576, 2825, 1577, 1575, 2004, - 1882, 4397, 1576, 3898, 1577, 1575, 5414, 3843, 2823, 3110, - 4391, 1576, 4664, 1577, 1575, 3116, 5150, 3813, 3119, 3120, - 3121, 3122, 3123, 3124, 3125, 3126, 3868, 3844, 3129, 3130, - 3131, 3132, 3133, 3134, 3135, 3136, 3137, 3138, 3139, 5149, - 3141, 3142, 3143, 3144, 3145, 3847, 3146, 5147, 3760, 3747, - 3851, 5146, 5145, 5144, 3800, 5143, 5247, 5142, 5140, 5139, - 3785, 16, 1576, 3809, 1577, 1575, 16, 5095, 3473, 4982, - 3783, 3165, 4392, 3167, 3372, 4963, 1576, 17, 1577, 1575, - 3881, 3781, 3883, 1576, 3834, 1577, 1575, 3831, 1576, 5371, - 1577, 1575, 3379, 3888, 3882, 3972, 15, 3885, 3886, 38, - 3890, 3891, 2204, 3840, 38, 3841, 3836, 1581, 1582, 1583, - 1584, 1585, 1586, 1587, 1579, 3892, 3770, 2836, 3849, 3848, - 2407, 3495, 3784, 4007, 2089, 4935, 3991, 5121, 4909, 5372, - 4011, 3803, 3782, 4876, 4881, 4016, 4843, 820, 1841, 4753, - 4707, 4706, 3889, 3780, 4516, 4429, 4028, 4030, 4031, 4033, - 32, 4035, 4036, 3932, 1576, 32, 1577, 1575, 4390, 4373, - 1576, 3835, 1577, 1575, 3944, 3900, 3946, 1418, 3949, 3950, - 3895, 4069, 3879, 3951, 3952, 3953, 3954, 3955, 3769, 3956, - 3957, 3958, 3959, 3960, 3961, 3962, 3963, 3858, 3965, 3966, - 3967, 3968, 3884, 3857, 3973, 3794, 5370, 3977, 4609, 3980, - 3981, 3768, 3767, 3766, 4607, 3758, 3752, 44, 3894, 3751, - 3750, 4598, 44, 5412, 3749, 3748, 1576, 3864, 1577, 1575, - 3926, 3908, 3437, 3907, 3909, 1576, 4403, 1577, 1575, 1273, - 77, 1576, 3920, 1577, 1575, 3292, 3251, 3188, 1576, 77, - 1577, 1575, 4058, 4060, 2919, 3712, 3922, 3923, 993, 1003, - 2723, 3717, 3718, 4073, 2089, 2676, 3722, 2675, 994, 820, - 995, 999, 1002, 998, 996, 997, 4051, 2673, 2669, 2668, - 4597, 2622, 2371, 2368, 4088, 2013, 1418, 1736, 4055, 5394, - 820, 1402, 820, 2556, 3919, 5392, 3921, 4000, 1418, 4907, - 4908, 1418, 5373, 17, 4579, 5342, 4019, 1576, 17, 1577, - 1575, 4596, 5308, 3005, 5298, 4120, 3005, 4110, 5237, 4123, - 4513, 4124, 15, 5207, 4313, 4005, 837, 15, 5205, 4004, - 4303, 1827, 3020, 4889, 4133, 3050, 1000, 5174, 1576, 5076, - 1577, 1575, 4674, 5070, 3982, 3825, 3825, 1576, 5061, 1577, - 1575, 1576, 1401, 1577, 1575, 4084, 3941, 1576, 4096, 1577, - 1575, 1076, 5059, 3675, 5041, 3591, 5032, 1001, 3934, 3681, - 4126, 1576, 4997, 1577, 1575, 4996, 4987, 4986, 3990, 4077, - 3104, 4962, 3495, 1576, 1418, 1577, 1575, 4167, 4961, 4167, - 4171, 3273, 4171, 4171, 3275, 1576, 3933, 1577, 1575, 3274, - 3989, 1864, 1977, 1978, 1269, 4912, 4896, 5456, 1418, 1133, - 4894, 4880, 4844, 4737, 1983, 3930, 4736, 1987, 4735, 4061, - 3594, 4206, 1986, 1576, 3411, 1577, 1575, 4678, 4667, 5455, - 1882, 1882, 4087, 4652, 4651, 4649, 4199, 2338, 4642, 4119, - 1966, 4640, 1576, 4122, 1577, 1575, 4619, 4618, 4617, 4613, - 4612, 1576, 3409, 1577, 1575, 4131, 4583, 1979, 1598, 1599, - 1600, 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1590, - 4083, 4581, 4577, 4207, 4208, 4165, 4179, 4181, 820, 1576, - 4575, 1577, 1575, 4553, 4102, 4550, 1271, 4104, 77, 4164, - 3561, 4101, 4058, 4118, 4544, 4115, 3008, 4113, 1882, 4121, - 2426, 3790, 4385, 77, 4375, 77, 4358, 4128, 1841, 4340, - 3408, 2556, 2556, 4201, 4132, 5438, 4311, 4308, 5386, 1133, - 4149, 3406, 4276, 4152, 4234, 4233, 5384, 4230, 4229, 4166, - 3405, 4168, 4216, 4211, 3404, 5232, 3368, 1576, 4210, 1577, - 1575, 4231, 4147, 4081, 4263, 4200, 4045, 4037, 1576, 4027, - 1577, 1575, 4154, 4156, 3072, 3071, 4017, 1576, 4008, 1577, - 1575, 1576, 4006, 1577, 1575, 4172, 4173, 1589, 1588, 1598, - 1599, 1600, 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, - 1590, 2924, 3403, 3906, 3603, 4204, 3903, 5116, 3877, 4174, - 3856, 3833, 3402, 3798, 3913, 820, 3795, 5042, 3792, 2856, - 3917, 3918, 4220, 3779, 3771, 3761, 3759, 3755, 4117, 1576, - 3754, 1577, 1575, 3401, 3753, 3655, 4301, 4212, 4886, 1576, - 4243, 1577, 1575, 4247, 3480, 3462, 3450, 4304, 3438, 1578, - 3400, 3268, 3739, 3740, 3399, 1076, 1075, 1614, 3257, 5134, - 1576, 3217, 1577, 1575, 2952, 2939, 2938, 1625, 3756, 3757, - 4217, 2787, 2680, 4048, 2679, 4241, 4242, 1576, 4226, 1577, - 1575, 1576, 4225, 1577, 1575, 4232, 4239, 2671, 4228, 4235, - 2404, 2370, 4155, 1635, 2367, 2353, 4273, 2352, 2115, 4283, - 3396, 3801, 4285, 4286, 3395, 5132, 4279, 3807, 3394, 4288, - 1664, 1660, 1659, 4875, 4284, 1406, 3388, 1152, 4874, 5367, - 3444, 4343, 4862, 5365, 3373, 3444, 4345, 1576, 2649, 1577, - 1575, 1576, 4856, 1577, 1575, 1576, 4650, 1577, 1575, 4616, - 4359, 4602, 4361, 1576, 5366, 1577, 1575, 4367, 5364, 3675, - 3681, 1576, 4591, 1577, 1575, 246, 200, 233, 202, 4545, - 4434, 1418, 4422, 1962, 3367, 4290, 2260, 2259, 4355, 3344, - 201, 246, 4420, 4289, 1967, 1968, 1969, 1970, 1971, 1972, - 4413, 4336, 4318, 4368, 4334, 4320, 820, 2556, 4296, 4331, - 4330, 1576, 4312, 1577, 1575, 4327, 1576, 2705, 1577, 1575, - 4412, 4326, 4314, 4310, 4307, 4265, 4264, 4254, 2904, 1005, - 173, 4418, 4248, 4140, 4127, 2903, 4049, 4046, 3999, 173, - 3937, 4332, 2314, 2897, 3924, 4362, 3916, 4364, 2866, 3915, - 239, 1724, 3912, 4383, 4384, 1576, 3670, 1577, 1575, 2469, - 1827, 4440, 1576, 3246, 1577, 1575, 239, 5454, 2444, 4379, - 1576, 3494, 1577, 1575, 4451, 1576, 3242, 1577, 1575, 3675, - 3241, 3300, 3681, 2865, 4462, 3240, 4401, 1418, 2206, 3205, - 4468, 4220, 3204, 1418, 4448, 2991, 4278, 4341, 4415, 4350, - 2877, 4342, 4337, 4347, 2870, 4167, 4344, 813, 2860, 2859, - 1576, 2858, 1577, 1575, 2857, 1576, 173, 1577, 1575, 2855, - 2992, 5130, 2851, 2850, 4370, 4374, 4369, 2848, 2839, 4381, - 4410, 4378, 2835, 1418, 1418, 2834, 4539, 2754, 2678, 4419, - 1882, 2325, 2323, 2322, 2321, 4398, 2320, 246, 200, 233, - 202, 4400, 2274, 2273, 2264, 4548, 246, 1903, 5452, 5410, - 5408, 3691, 4442, 5385, 5374, 5304, 5303, 5302, 4441, 820, - 5278, 2556, 4435, 5271, 5269, 1827, 1418, 5167, 5120, 1654, - 5115, 4497, 5026, 4541, 4439, 5025, 4565, 5024, 4995, 4504, - 203, 264, 3692, 4525, 4526, 4527, 4528, 4970, 4964, 1134, - 4787, 4778, 4333, 4447, 4756, 4750, 4438, 1935, 4724, 4708, - 4523, 4520, 4518, 4511, 4510, 4507, 4506, 4505, 4585, 4406, - 4357, 4353, 239, 4561, 4456, 4459, 4464, 4458, 4309, 4143, - 4137, 239, 1982, 1985, 1957, 1976, 1973, 1959, 1954, 4042, - 909, 4039, 4038, 3964, 3925, 3793, 4554, 4512, 3787, 3704, - 3620, 3614, 3610, 1813, 3434, 3215, 3190, 3147, 3033, 3014, - 4530, 2964, 2963, 2918, 2808, 2181, 239, 4538, 1650, 1270, - 4536, 2693, 2478, 2438, 2349, 2060, 1974, 1735, 173, 3603, - 3603, 4557, 4543, 1714, 2444, 4546, 4549, 4632, 1139, 1709, - 4551, 4638, 1708, 173, 4552, 173, 4588, 4644, 4556, 4558, - 4634, 1707, 1706, 4560, 837, 837, 4559, 837, 4555, 1134, - 1705, 1704, 1703, 1702, 1701, 1700, 1699, 1698, 1697, 1696, - 1695, 4584, 1694, 1693, 3603, 4570, 1692, 4580, 1691, 1690, - 1689, 1688, 1687, 4582, 1686, 1685, 1684, 1418, 1882, 1882, - 4601, 16, 4679, 4603, 1683, 1418, 4606, 1682, 4608, 4610, - 1681, 1680, 1679, 4604, 1678, 1677, 1676, 4600, 1675, 1674, - 1673, 4599, 1672, 1418, 1671, 1670, 1667, 4710, 1666, 1665, - 4103, 1663, 1662, 1661, 1658, 1651, 4641, 4720, 4643, 38, - 1648, 4676, 2082, 4709, 1647, 4614, 1646, 1645, 1644, 1643, - 1642, 1641, 1640, 4622, 4675, 1639, 1418, 1638, 1637, 1636, - 1630, 4654, 1418, 1629, 1628, 1627, 4635, 4685, 2103, 1626, - 1539, 1500, 1403, 5127, 4681, 1882, 4685, 4714, 4508, 4628, - 4677, 3647, 3648, 2741, 2980, 1447, 5411, 5321, 4655, 5319, - 32, 4658, 5256, 4223, 820, 3799, 1418, 1418, 1418, 3578, - 3210, 1418, 1418, 4668, 2997, 4691, 1538, 1467, 3045, 1418, - 4141, 1418, 3031, 3658, 4682, 4693, 4701, 3495, 4687, 4688, - 4700, 4781, 4698, 3030, 4683, 3043, 4716, 3044, 3659, 4442, - 4784, 3657, 4786, 3660, 4780, 4712, 4713, 3038, 4826, 4775, - 3656, 4727, 3039, 2149, 2150, 2151, 2152, 44, 3653, 4497, - 4726, 3042, 3029, 4760, 4761, 4762, 4738, 4504, 4776, 4777, - 3036, 4164, 4839, 4840, 4725, 3037, 4731, 4730, 3034, 82, - 5187, 4835, 5045, 3035, 4145, 5044, 5017, 4831, 5446, 1882, - 2698, 1882, 5442, 1882, 4146, 4562, 4729, 4431, 3870, 3623, - 1797, 2208, 2423, 2424, 4079, 2212, 2213, 2214, 2215, 3061, - 4822, 4417, 4611, 1614, 1824, 4161, 2254, 4162, 4870, 4829, - 3114, 4877, 4878, 1498, 820, 2265, 2418, 2419, 2420, 3974, - 3063, 3062, 4852, 3838, 4854, 4531, 4855, 4250, 4890, 4469, - 4892, 4828, 3735, 17, 4382, 4144, 4563, 4252, 4253, 2537, - 3736, 3737, 3738, 2293, 2294, 3618, 4251, 811, 1950, 1999, - 1142, 4846, 15, 2204, 1802, 4830, 3329, 4851, 3202, 3203, - 5235, 2946, 2945, 1995, 1225, 2954, 4893, 1999, 4895, 4537, - 3722, 2324, 2953, 2326, 2327, 2328, 2329, 2330, 2640, 2549, - 1533, 4925, 5165, 2339, 4967, 4921, 4648, 4097, 4053, 4861, - 818, 4052, 4863, 3685, 4871, 4847, 4872, 3271, 4873, 5236, - 3603, 3065, 2988, 2442, 2395, 5334, 1936, 2260, 2259, 4720, - 4720, 4936, 3825, 5305, 4944, 4948, 4966, 4592, 4898, 1733, - 1734, 1731, 1732, 4590, 4517, 4209, 4519, 1729, 1730, 2204, - 1727, 1728, 3172, 3166, 4917, 3161, 3060, 4911, 4923, 4899, - 2560, 1528, 1527, 4920, 4689, 1566, 3872, 2702, 2193, 4938, - 4924, 1144, 1145, 1146, 1147, 3665, 1268, 1499, 1142, 5285, - 2955, 2069, 4588, 1476, 1475, 4926, 1458, 4928, 1142, 1418, - 1142, 1499, 2431, 2725, 4660, 3327, 5283, 5216, 1418, 5184, - 5183, 4942, 4943, 4659, 3326, 5181, 5080, 5027, 4782, 4605, - 4939, 4576, 4568, 4454, 4453, 4272, 4271, 1718, 3099, 4981, - 3086, 1902, 4567, 4257, 3945, 1215, 3407, 1473, 5323, 5322, - 4937, 5228, 5229, 5322, 4965, 1882, 4639, 4360, 5014, 5289, - 4346, 4323, 3893, 3457, 5020, 3456, 4976, 1588, 1598, 1599, - 1600, 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1590, - 2339, 3448, 4977, 3447, 3222, 2339, 2339, 3218, 2837, 2148, - 1443, 1412, 1311, 5323, 77, 4752, 5307, 5306, 5011, 1144, - 1145, 1146, 1147, 5225, 1268, 5015, 5016, 5234, 5223, 5221, - 3477, 2614, 3475, 2218, 5060, 4983, 4657, 2914, 1990, 1268, - 818, 5053, 5065, 1144, 1145, 1146, 1147, 5435, 5436, 5460, - 5461, 5072, 5309, 5107, 2192, 4322, 814, 5028, 1491, 3825, - 91, 2, 5347, 5348, 1, 4407, 4408, 4409, 3992, 2916, - 2656, 2347, 1725, 2659, 173, 173, 2662, 173, 1270, 2664, - 5067, 3340, 5068, 1143, 5047, 5051, 1858, 813, 3182, 1589, - 1588, 1598, 1599, 1600, 1601, 1591, 1592, 1593, 1594, 1595, - 1596, 1597, 1590, 2606, 5029, 1589, 1588, 1598, 1599, 1600, - 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1590, 5057, - 5058, 1418, 1886, 837, 2351, 5110, 1149, 837, 837, 3603, - 5069, 5075, 2218, 2218, 2218, 3051, 5082, 2218, 2218, 5141, - 5084, 5091, 5081, 837, 3052, 2142, 1418, 2142, 3664, 5097, - 3054, 5100, 5101, 1498, 2623, 1453, 3463, 2774, 3814, 3159, - 2968, 4072, 1814, 1882, 5163, 5109, 1221, 5148, 2266, 1434, - 2028, 5118, 1433, 1431, 2209, 2287, 1007, 5171, 5125, 3000, - 3788, 3762, 4450, 5333, 4734, 5387, 5277, 5168, 5169, 5105, - 5336, 2684, 2055, 991, 5175, 4274, 3865, 5033, 5281, 5126, - 5128, 5129, 5131, 5133, 5035, 5172, 5162, 4850, 2779, 1571, - 4114, 872, 1053, 1019, 2688, 3947, 3942, 5206, 1613, 1018, - 4395, 3567, 5021, 5193, 4929, 873, 2665, 5030, 4848, 4789, - 1951, 1956, 5173, 3064, 1882, 4821, 4950, 5111, 5180, 5178, - 4728, 4157, 3709, 1989, 5199, 5201, 5136, 4521, 5203, 4866, - 4864, 4865, 3971, 5018, 4948, 4832, 5208, 916, 2585, 779, - 4779, 5200, 5202, 5204, 5240, 2995, 2243, 5213, 5077, 4969, - 1882, 1191, 4376, 2978, 1184, 3337, 5214, 5218, 5217, 5215, - 3589, 3588, 5219, 2160, 1580, 2179, 4315, 4316, 1624, 961, - 2819, 3564, 4491, 5227, 3832, 90, 89, 88, 5233, 1589, - 1588, 1598, 1599, 1600, 1601, 1591, 1592, 1593, 1594, 1595, - 1596, 1597, 1590, 5248, 272, 5020, 1010, 5261, 271, 4887, - 5262, 4672, 5263, 5170, 5264, 988, 987, 986, 5265, 985, - 984, 983, 2452, 2451, 2453, 2450, 2817, 2448, 2447, 1821, - 2822, 1820, 4256, 4566, 3220, 3221, 3725, 4532, 2831, 3720, - 2489, 2485, 5268, 1849, 2486, 3089, 3101, 2484, 5253, 5284, - 4298, 5286, 5287, 5282, 5280, 5276, 2838, 1418, 3603, 1589, - 1588, 1598, 1599, 1600, 1601, 1591, 1592, 1593, 1594, 1595, - 1596, 1597, 1590, 1134, 5295, 4593, 5296, 2840, 5122, 5123, - 4749, 1721, 3772, 5297, 4587, 2847, 2417, 3096, 2505, 3742, - 5301, 2502, 2501, 3734, 4745, 2218, 4739, 2534, 5087, 5357, - 5222, 5360, 5224, 4697, 2142, 4696, 5352, 5312, 5313, 5220, - 3972, 5311, 4695, 4461, 3680, 2868, 5332, 4694, 5316, 2271, - 2873, 2874, 2875, 4684, 5320, 2878, 2879, 2880, 2881, 2882, - 2883, 2884, 2885, 5318, 2887, 2888, 5339, 2890, 2891, 5328, - 4472, 1418, 4473, 5355, 5355, 5355, 1418, 4480, 1361, 2987, - 5359, 5362, 5331, 5343, 5346, 5193, 1330, 1325, 1327, 1328, - 1326, 3352, 5350, 4237, 5351, 1825, 5363, 3069, 4091, 3486, - 3485, 3483, 5110, 5377, 5376, 3482, 1775, 5383, 5389, 5324, - 5325, 5326, 5327, 2239, 5071, 5209, 4653, 3493, 3491, 1457, - 2236, 2061, 2057, 1448, 2238, 2235, 2237, 2241, 2242, 1400, - 3010, 4020, 2240, 1891, 1741, 5407, 1900, 5407, 5396, 1739, - 3654, 4824, 3032, 813, 2612, 4948, 3837, 1822, 5409, 1819, - 4138, 1818, 1299, 5413, 1298, 2617, 1272, 240, 1897, 241, - 172, 1131, 2271, 4351, 4416, 3816, 3173, 2535, 3272, 5355, - 5423, 5420, 5355, 5423, 5425, 5355, 5423, 5426, 5359, 5339, - 5428, 5362, 5427, 5421, 173, 3674, 4901, 2422, 1185, 1405, - 2976, 5432, 5389, 5434, 5439, 126, 5417, 48, 145, 1215, - 125, 5443, 5444, 219, 1413, 2537, 69, 5449, 5451, 218, - 68, 20, 143, 217, 67, 53, 52, 2218, 215, 121, - 120, 119, 118, 142, 5458, 214, 66, 3058, 256, 255, - 1450, 1452, 258, 257, 254, 5457, 3231, 5459, 3232, 253, - 1939, 252, 2142, 5185, 4692, 5270, 51, 50, 220, 49, - 127, 4956, 70, 47, 46, 2724, 4040, 2068, 4371, 3478, - 2960, 2512, 77, 45, 40, 77, 77, 14, 77, 2224, - 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2232, 2233, 2234, - 2246, 2247, 2248, 2249, 2250, 2251, 2244, 2245, 12, 43, - 41, 25, 24, 173, 2034, 23, 31, 173, 173, 30, - 4927, 13, 39, 37, 201, 246, 200, 233, 202, 1830, - 1831, 36, 1833, 173, 164, 1837, 163, 1846, 1847, 1848, - 35, 162, 161, 160, 2046, 159, 158, 157, 2339, 156, - 2339, 226, 34, 22, 837, 837, 61, 60, 59, 58, - 1573, 57, 2528, 56, 8, 4444, 837, 139, 149, 2339, - 2339, 148, 150, 146, 141, 138, 33, 140, 1910, 1911, - 136, 137, 1914, 1915, 1916, 1917, 1918, 130, 1920, 1921, - 1922, 837, 1924, 4785, 1927, 129, 1929, 1930, 1931, 128, - 239, 122, 102, 101, 1076, 100, 2035, 115, 114, 113, - 112, 111, 4984, 4985, 110, 108, 1935, 109, 871, 4989, - 4990, 4991, 4992, 4993, 4994, 99, 98, 97, 4998, 4999, - 5000, 5001, 5002, 5003, 96, 95, 135, 134, 131, 5006, - 5007, 5008, 117, 124, 123, 106, 5012, 1589, 1588, 1598, - 1599, 1600, 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, - 1590, 2516, 116, 107, 105, 104, 103, 94, 3277, 93, - 3280, 4783, 2522, 92, 133, 132, 147, 221, 71, 198, - 197, 196, 195, 5299, 194, 192, 193, 191, 190, 189, - 188, 187, 2510, 2544, 186, 62, 2511, 2513, 2515, 63, - 2517, 2518, 2519, 2523, 2524, 2525, 2527, 2530, 2531, 2532, - 64, 65, 210, 209, 211, 223, 222, 2520, 2529, 2521, - 213, 3308, 3309, 216, 1613, 1589, 1588, 1598, 1599, 1600, - 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1590, 212, - 207, 205, 208, 206, 204, 5083, 1589, 1588, 1598, 1599, - 1600, 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1590, - 1354, 83, 11, 144, 21, 18, 3, 2142, 5106, 5448, - 5450, 2536, 3825, 5368, 0, 0, 0, 0, 199, 231, - 243, 232, 0, 151, 0, 0, 0, 5119, 247, 0, - 3346, 3938, 0, 3350, 0, 0, 0, 0, 0, 0, - 0, 0, 2052, 225, 224, 3370, 3371, 0, 0, 0, - 0, 0, 0, 0, 3374, 3375, 0, 1215, 1215, 1809, - 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, - 3380, 3381, 3382, 0, 0, 1832, 0, 0, 0, 0, - 0, 2533, 0, 0, 1851, 1589, 1588, 1598, 1599, 1600, - 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1590, 2508, - 0, 0, 0, 2507, 0, 1888, 0, 0, 0, 3418, - 0, 3420, 0, 0, 3423, 0, 2149, 0, 0, 2339, - 0, 0, 0, 0, 0, 0, 0, 2526, 173, 0, - 0, 0, 2201, 2202, 0, 173, 2514, 1372, 1373, 1334, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2472, 0, 0, 0, 0, 0, 0, - 1362, 1366, 1368, 1370, 1375, 0, 1380, 1376, 1377, 1378, - 1379, 0, 0, 1357, 1358, 1359, 1360, 3349, 1333, 1363, - 0, 1335, 1825, 1336, 1338, 1339, 1340, 1341, 1337, 1342, - 1343, 1344, 1345, 1346, 1353, 1355, 1347, 1348, 1349, 1350, - 1351, 1352, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, - 1390, 1389, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, - 1365, 1367, 1369, 1371, 1374, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2621, 0, 0, - 0, 3931, 0, 0, 2535, 0, 0, 0, 0, 2495, - 0, 0, 2543, 0, 0, 0, 0, 0, 0, 0, - 0, 1356, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 173, 0, 0, 173, 173, 0, 173, 0, - 0, 0, 2537, 2504, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2538, 2539, 1589, 1588, 1598, 1599, 1600, - 1601, 1591, 1592, 1593, 1594, 1595, 1596, 1597, 1590, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2503, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 173, 0, 0, 79, 0, 0, 2512, 0, - 0, 0, 0, 0, 173, 173, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 173, 0, 928, 927, - 934, 924, 0, 0, 0, 0, 2053, 242, 2054, 0, - 0, 931, 932, 0, 933, 937, 0, 0, 918, 0, - 0, 173, 0, 0, 0, 0, 0, 0, 942, 2339, - 0, 0, 0, 0, 0, 0, 2812, 0, 0, 0, - 2509, 0, 0, 0, 0, 0, 0, 0, 0, 2614, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2528, - 1589, 1588, 1598, 1599, 1600, 1601, 1591, 1592, 1593, 1594, - 1595, 1596, 1597, 1590, 0, 77, 946, 0, 0, 948, - 0, 0, 0, 3850, 947, 3852, 0, 0, 0, 0, - 0, 0, 0, 2628, 2629, 0, 0, 0, 0, 0, - 2635, 0, 0, 0, 169, 0, 0, 0, 0, 2642, - 1935, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 837, 837, 0, - 837, 837, 0, 0, 0, 0, 0, 837, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2491, 2496, 2494, - 0, 1613, 0, 2488, 0, 0, 0, 0, 2516, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2522, - 0, 0, 0, 0, 0, 0, 0, 2506, 0, 2490, - 0, 0, 0, 0, 0, 2694, 0, 0, 0, 2510, - 2544, 0, 0, 2511, 2513, 2515, 3911, 2517, 2518, 2519, - 2523, 2524, 2525, 2527, 2530, 2531, 2532, 0, 0, 0, - 0, 0, 0, 0, 2520, 2529, 2521, 0, 0, 0, - 0, 0, 0, 0, 0, 3935, 2498, 0, 0, 0, - 0, 1364, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2376, 2377, 2378, 0, 0, 0, 0, 0, 0, - 0, 919, 921, 920, 0, 0, 0, 0, 0, 0, - 0, 3969, 0, 926, 0, 0, 0, 0, 2536, 0, - 0, 0, 0, 0, 0, 930, 0, 0, 2416, 0, - 0, 0, 945, 0, 0, 0, 0, 2430, 0, 923, - 0, 0, 0, 913, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2482, 2483, 0, 0, 0, - 2492, 2493, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2533, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2508, 0, 0, 0, - 2507, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1329, 0, 0, 0, 0, - 0, 0, 0, 0, 2526, 0, 0, 0, 1354, 0, - 0, 0, 0, 2514, 0, 0, 0, 173, 0, 1452, - 0, 0, 173, 0, 0, 1452, 1270, 2541, 2540, 173, - 173, 0, 0, 0, 0, 0, 1825, 1825, 1825, 1825, - 1825, 1825, 1825, 1825, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 925, 929, 935, 0, 936, 938, - 0, 0, 939, 940, 941, 0, 0, 0, 943, 944, - 0, 0, 0, 0, 2500, 0, 0, 0, 0, 2339, - 0, 0, 0, 0, 0, 2339, 0, 0, 0, 0, - 4125, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4135, 0, 0, 4136, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2542, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1372, 1373, 1334, 0, 0, - 1354, 1323, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1450, 0, 0, 0, 2721, 1362, 1366, - 1368, 1370, 1375, 4175, 1380, 1376, 1377, 1378, 1379, 0, - 0, 1357, 1358, 1359, 1360, 1332, 1333, 1363, 0, 1335, - 0, 1336, 1338, 1339, 1340, 1341, 1337, 1342, 1343, 1344, - 1345, 1346, 1353, 1355, 1347, 1348, 1349, 1350, 1351, 1352, - 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1390, 1389, - 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1365, 1367, - 1369, 1371, 1374, 0, 922, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4219, 0, 0, 0, 0, 0, 0, 1356, - 77, 0, 0, 0, 0, 77, 0, 2509, 0, 0, - 0, 1270, 949, 950, 951, 952, 953, 1372, 1373, 1334, - 0, 0, 0, 0, 0, 0, 0, 173, 173, 0, - 173, 173, 0, 0, 0, 0, 0, 173, 0, 0, - 1362, 1366, 1368, 1370, 1375, 0, 1380, 1376, 1377, 1378, - 1379, 0, 0, 1357, 1358, 1359, 1360, 1332, 1333, 1363, - 0, 1335, 0, 1336, 1338, 1339, 1340, 1341, 1337, 1342, - 1343, 1344, 1345, 1346, 1353, 1355, 1347, 1348, 1349, 1350, - 1351, 1352, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, - 1390, 1389, 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, - 1365, 1367, 1369, 1371, 1374, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4302, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4305, 4306, - 0, 1356, 0, 0, 0, 2535, 0, 0, 0, 0, - 2495, 0, 0, 2543, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4319, 0, 0, 4321, 0, - 0, 0, 0, 2537, 2504, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2538, 2539, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2940, 0, 2942, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2503, 0, 0, 0, 201, 246, 200, 233, 202, 0, - 0, 0, 0, 0, 2966, 2967, 0, 0, 0, 2512, - 0, 4219, 0, 0, 234, 0, 0, 0, 2984, 2985, - 2986, 226, 0, 0, 0, 235, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 203, 0, - 0, 0, 0, 0, 0, 170, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 239, 0, 0, 0, 173, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2528, 0, 0, 0, 0, 0, 0, 0, 0, 1364, - 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, - 0, 0, 928, 927, 934, 924, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 931, 932, 0, 933, 937, - 0, 0, 918, 0, 0, 0, 0, 0, 1825, 0, - 1825, 0, 942, 0, 0, 0, 0, 0, 2535, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 180, 181, 0, 182, 183, 0, 0, 0, 184, 0, - 0, 185, 0, 0, 1851, 0, 0, 0, 3688, 3689, - 2494, 0, 0, 0, 3687, 0, 2537, 0, 1576, 2516, - 1577, 1575, 0, 0, 0, 0, 0, 2339, 0, 0, - 2522, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1888, 0, 0, 0, 0, 2339, 0, 0, 0, 0, - 2510, 2544, 0, 0, 2511, 2513, 2515, 0, 2517, 2518, - 2519, 2523, 2524, 2525, 2527, 2530, 2531, 2532, 0, 0, - 1452, 1364, 2512, 1329, 0, 2520, 2529, 2521, 199, 231, - 243, 232, 84, 151, 0, 0, 0, 2498, 247, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2535, - 0, 0, 153, 225, 224, 0, 0, 201, 246, 85, - 2243, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 179, 0, 2536, - 0, 0, 0, 0, 4615, 0, 0, 2537, 0, 0, - 0, 0, 1825, 0, 0, 0, 0, 0, 0, 4922, - 173, 0, 0, 2528, 152, 173, 0, 0, 3604, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 227, 228, 229, 0, 0, 0, 0, 0, 0, 0, - 0, 2492, 2493, 239, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2512, 0, 919, 921, 920, 0, 2533, - 0, 0, 0, 0, 0, 0, 0, 926, 0, 0, - 0, 0, 0, 0, 0, 1329, 0, 2508, 0, 930, - 0, 2507, 0, 0, 0, 0, 945, 0, 0, 0, - 0, 0, 0, 923, 0, 0, 4711, 0, 0, 0, - 0, 0, 0, 0, 0, 2526, 236, 0, 1635, 0, - 837, 0, 2516, 0, 2514, 0, 0, 0, 0, 0, - 0, 0, 0, 2522, 0, 0, 0, 165, 2541, 2540, - 0, 230, 0, 166, 2528, 0, 0, 0, 0, 0, - 0, 0, 0, 2510, 2544, 0, 0, 2511, 2513, 2515, - 0, 2517, 2518, 2519, 2523, 2524, 2525, 2527, 2530, 2531, - 2532, 0, 0, 0, 0, 2535, 0, 0, 2520, 2529, - 2521, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2500, 0, 0, 0, 167, - 0, 0, 0, 0, 0, 0, 0, 2239, 0, 0, - 0, 0, 75, 2537, 2236, 0, 0, 0, 2238, 2235, - 2237, 2241, 2242, 0, 0, 0, 2240, 0, 0, 0, - 0, 0, 2536, 0, 0, 0, 4834, 0, 2542, 0, - 0, 247, 0, 2516, 0, 0, 3605, 0, 0, 3458, - 3459, 3460, 0, 0, 2522, 0, 0, 0, 925, 929, - 935, 0, 936, 938, 0, 79, 939, 940, 941, 2512, - 0, 860, 943, 944, 2510, 2544, 0, 0, 2511, 2513, - 2515, 0, 2517, 2518, 2519, 2523, 2524, 2525, 2527, 2530, - 2531, 2532, 0, 0, 0, 0, 177, 242, 178, 2520, - 2529, 2521, 2533, 0, 0, 0, 0, 0, 0, 0, - 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, - 2508, 0, 3637, 0, 2507, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 856, 857, 0, 2526, 0, - 2528, 0, 0, 2536, 0, 0, 902, 2514, 0, 0, - 0, 0, 0, 2224, 2225, 2226, 2227, 2228, 2229, 2230, - 2231, 2232, 2233, 2234, 2246, 2247, 2248, 2249, 2250, 2251, - 2244, 2245, 0, 0, 1935, 1270, 0, 173, 2509, 0, - 0, 0, 0, 168, 169, 55, 0, 0, 0, 0, - 0, 73, 0, 0, 0, 0, 9, 0, 0, 0, - 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2533, 0, 4968, 0, 0, 922, 0, - 1825, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 74, 2508, 174, 175, 0, 2507, 176, 0, 0, 2516, - 0, 0, 904, 0, 0, 903, 0, 0, 0, 0, - 2522, 0, 0, 0, 0, 0, 0, 0, 0, 2526, - 0, 0, 0, 0, 0, 173, 0, 0, 2514, 0, - 2510, 2544, 0, 0, 2511, 2513, 2515, 0, 2517, 2518, - 2519, 2523, 2524, 2525, 2527, 2530, 2531, 2532, 0, 0, - 77, 0, 0, 0, 0, 2520, 2529, 2521, 0, 889, - 0, 0, 0, 0, 0, 3839, 0, 0, 0, 861, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4499, 0, 0, 0, 0, 0, 4478, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 863, 0, 3606, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2536, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4492, 0, - 0, 0, 0, 4221, 0, 0, 860, 0, 0, 0, - 0, 0, 4481, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4475, 0, 0, 0, 0, 4501, 4502, - 5099, 0, 0, 0, 4476, 0, 0, 0, 0, 0, - 0, 2509, 0, 885, 0, 887, 884, 0, 0, 2533, - 888, 0, 0, 5117, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2508, 0, 0, - 0, 2507, 0, 4477, 0, 4484, 0, 0, 0, 173, - 856, 857, 0, 0, 0, 0, 0, 0, 0, 0, - 173, 902, 0, 0, 0, 2526, 883, 0, 0, 0, - 0, 0, 0, 0, 2514, 0, 0, 0, 855, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 862, - 897, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 893, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2509, 0, 0, 0, 0, 0, 1295, 0, - 4795, 0, 0, 0, 0, 0, 0, 894, 898, 848, - 0, 4018, 0, 0, 1207, 0, 1208, 904, 0, 0, - 903, 0, 0, 0, 0, 0, 0, 4500, 880, 3079, - 878, 882, 901, 0, 5245, 0, 879, 876, 874, 5249, - 881, 865, 866, 864, 4816, 854, 867, 868, 869, 870, - 849, 0, 0, 899, 4488, 900, 1189, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 895, 896, 0, 0, - 1202, 0, 1197, 2980, 889, 0, 4485, 4489, 4487, 4486, - 0, 0, 4221, 1296, 861, 0, 4794, 0, 0, 0, - 0, 0, 173, 173, 0, 0, 0, 0, 0, 0, - 4795, 0, 0, 0, 891, 0, 0, 0, 0, 0, - 0, 863, 0, 850, 0, 0, 0, 0, 0, 0, - 0, 0, 886, 0, 0, 0, 0, 0, 0, 875, - 0, 0, 0, 4082, 4495, 4496, 0, 173, 0, 0, - 0, 1178, 0, 0, 4816, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4098, 0, 4099, 0, 0, 0, - 0, 5245, 0, 0, 0, 0, 0, 0, 0, 1825, - 0, 0, 0, 1289, 0, 1281, 1285, 1287, 0, 0, - 0, 0, 0, 0, 0, 0, 4794, 0, 885, 0, - 887, 884, 0, 0, 0, 888, 0, 0, 2509, 0, - 0, 1292, 0, 0, 0, 1284, 0, 4503, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 890, 0, - 4479, 0, 0, 4494, 858, 859, 0, 0, 847, 851, - 0, 1204, 0, 1196, 5245, 0, 852, 0, 0, 0, - 0, 883, 1201, 1199, 0, 0, 0, 853, 0, 0, - 0, 0, 0, 855, 0, 0, 1290, 0, 0, 0, - 0, 0, 0, 1190, 862, 897, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4791, 1293, 0, - 0, 0, 0, 0, 1825, 1294, 893, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 173, 0, 1206, 0, 0, 0, 0, 1195, 0, 0, - 0, 1194, 0, 0, 0, 0, 0, 1183, 0, 0, - 0, 0, 894, 898, 0, 0, 0, 0, 0, 0, - 1282, 0, 0, 0, 0, 0, 1188, 0, 5441, 0, - 0, 0, 1452, 880, 0, 878, 882, 901, 0, 0, - 0, 879, 876, 874, 1291, 881, 865, 866, 864, 0, - 854, 867, 868, 869, 870, 849, 0, 0, 899, 1205, - 900, 0, 0, 0, 0, 0, 0, 4791, 4796, 4797, - 0, 895, 896, 0, 1200, 0, 0, 0, 1186, 0, - 0, 0, 1283, 0, 0, 4792, 4793, 4221, 4800, 4799, - 4798, 4814, 4815, 4817, 4801, 4802, 4805, 4807, 4806, 4803, - 4804, 4808, 4810, 4811, 4812, 4809, 0, 4813, 0, 891, - 0, 0, 0, 4818, 0, 0, 0, 1205, 850, 0, - 4820, 0, 0, 0, 4819, 0, 4493, 886, 0, 0, - 0, 0, 0, 0, 875, 0, 0, 0, 0, 0, - 1187, 4498, 0, 173, 0, 0, 0, 0, 0, 4292, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1288, 0, 0, 0, 4796, 4797, - 0, 0, 0, 0, 0, 0, 0, 0, 4482, 4483, - 0, 0, 0, 0, 0, 4792, 4793, 0, 4800, 4799, - 4798, 4814, 4815, 4817, 4801, 4802, 4805, 4807, 4806, 4803, - 4804, 4808, 4810, 4811, 4812, 4809, 0, 4813, 1278, 0, - 0, 0, 0, 4818, 0, 0, 0, 0, 0, 0, - 4820, 0, 1203, 890, 4819, 0, 0, 0, 0, 858, - 859, 0, 0, 847, 851, 0, 0, 0, 0, 0, - 0, 852, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 853, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1182, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1297, - 1452, 0, 0, 1277, 1279, 0, 0, 0, 0, 0, - 0, 1280, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1179, 0, 0, - 0, 1177, 1180, 0, 0, 0, 0, 0, 0, 1181, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1452, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 341, 342, 343, 1099, 345, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 201, 246, 1026, 0, - 0, 0, 0, 0, 0, 0, 0, 506, 0, 0, - 650, 684, 673, 762, 637, 0, 0, 0, 0, 0, - 0, 977, 0, 0, 0, 400, 0, 0, 469, 688, - 669, 680, 670, 512, 655, 656, 657, 664, 412, 658, - 794, 660, 629, 661, 630, 662, 663, 1616, 687, 636, - 548, 488, 0, 704, 0, 0, 1100, 1110, 0, 0, - 0, 173, 0, 0, 0, 0, 1095, 0, 0, 0, - 0, 0, 968, 0, 0, 1006, 1076, 1075, 993, 1003, - 0, 0, 371, 270, 631, 758, 633, 632, 994, 0, - 995, 999, 1002, 998, 996, 997, 0, 1090, 0, 0, - 0, 0, 0, 0, 960, 972, 0, 978, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 969, 970, 0, 0, 0, 0, 1027, - 0, 971, 0, 973, 0, 0, 0, 0, 549, 577, - 0, 590, 0, 438, 439, 1022, 1000, 1004, 4759, 0, - 0, 0, 356, 556, 574, 372, 543, 588, 377, 551, - 567, 367, 505, 539, 0, 0, 358, 572, 550, 483, - 357, 0, 532, 397, 414, 394, 503, 1001, 0, 1025, - 1029, 393, 1116, 1023, 582, 360, 0, 581, 502, 475, - 568, 573, 484, 477, 0, 359, 570, 482, 476, 452, - 404, 1117, 453, 454, 455, 456, 457, 458, 418, 1105, - 473, 519, 419, 490, 489, 491, 420, 421, 422, 423, - 424, 425, 426, 427, 428, 429, 0, 0, 0, 0, - 0, 612, 613, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 750, 1020, - 247, 755, 0, 584, 0, 0, 1097, 0, 0, 0, - 554, 0, 0, 459, 0, 0, 0, 1024, 4879, 535, - 508, 1113, 0, 0, 533, 471, 569, 520, 575, 557, - 583, 527, 521, 350, 558, 396, 485, 368, 370, 783, - 398, 401, 405, 406, 496, 497, 514, 542, 561, 562, - 563, 395, 382, 534, 383, 415, 384, 351, 387, 386, - 388, 544, 389, 353, 515, 566, 0, 411, 530, 480, - 354, 479, 516, 565, 564, 369, 592, 599, 600, 692, - 0, 605, 797, 798, 799, 614, 0, 522, 365, 362, - 0, 0, 0, 391, 517, 378, 380, 381, 379, 511, - 513, 619, 620, 621, 623, 624, 625, 626, 0, 0, - 0, 0, 627, 693, 711, 677, 646, 607, 701, 643, - 647, 648, 432, 433, 434, 435, 714, 0, 0, 0, - 598, 460, 461, 0, 403, 402, 481, 355, 0, 0, - 449, 431, 523, 361, 399, 451, 437, 462, 463, 464, - 465, 466, 0, 467, 468, 409, 340, 346, 791, 1094, - 504, 716, 753, 754, 638, 0, 1112, 1089, 1091, 1092, - 1096, 1101, 1102, 1103, 1104, 1106, 1108, 1111, 1115, 790, - 0, 694, 708, 795, 707, 787, 510, 0, 541, 705, - 652, 0, 698, 671, 672, 0, 699, 667, 703, 0, - 640, 0, 608, 611, 642, 729, 730, 731, 352, 610, - 733, 734, 735, 736, 737, 738, 739, 732, 1114, 675, - 651, 678, 589, 654, 653, 0, 0, 689, 1028, 690, - 691, 492, 493, 494, 495, 1098, 717, 376, 609, 525, - 526, 0, 676, 0, 0, 0, 0, 0, 0, 0, - 0, 681, 682, 679, 800, 0, 740, 741, 0, 0, - 603, 604, 408, 0, 622, 416, 375, 509, 410, 587, - 440, 0, 615, 683, 616, 528, 529, 744, 749, 745, - 746, 748, 769, 499, 430, 436, 545, 450, 472, 531, - 586, 507, 536, 373, 576, 547, 478, 668, 696, 1123, - 1093, 1122, 1124, 1125, 1121, 1126, 1127, 1107, 982, 0, - 1035, 1036, 1119, 1118, 1120, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 725, 724, 723, 722, - 721, 720, 719, 718, 0, 0, 665, 390, 788, 782, - 789, 770, 773, 772, 747, 989, 347, 645, 470, 524, - 407, 712, 713, 0, 768, 1083, 1046, 1047, 1048, 979, - 1049, 1043, 1044, 980, 1045, 1084, 1033, 1080, 1081, 1008, - 1038, 1050, 1079, 1051, 1082, 1009, 1085, 1128, 1129, 1057, - 1041, 303, 1130, 1054, 1086, 1078, 1077, 1052, 1034, 1087, - 1088, 1016, 1011, 1055, 1056, 1042, 1063, 1064, 1065, 1068, - 981, 1069, 1070, 1071, 1072, 1073, 1067, 1066, 1030, 1031, - 1032, 1058, 1059, 1061, 1062, 1037, 555, 1012, 1013, 1014, - 1015, 0, 0, 593, 594, 595, 618, 0, 596, 578, - 644, 417, 348, 559, 585, 785, 786, 0, 0, 0, - 0, 0, 0, 0, 695, 706, 742, 743, 0, 756, - 757, 759, 761, 1074, 763, 552, 553, 771, 0, 0, - 441, 363, 364, 500, 501, 538, 0, 442, 443, 444, - 448, 445, 446, 447, 1060, 766, 767, 764, 474, 537, - 560, 546, 784, 487, 0, 792, 634, 635, 793, 752, - 751, 349, 0, 1039, 1040, 709, 710, 0, 0, 1109, - 486, 641, 0, 974, 341, 342, 343, 1099, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1026, 0, 0, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 0, 0, - 0, 0, 0, 977, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 1017, - 687, 636, 548, 488, 0, 704, 0, 0, 1100, 1110, - 0, 0, 0, 0, 0, 0, 0, 0, 1095, 0, - 0, 0, 0, 0, 968, 0, 0, 1006, 1076, 1075, - 993, 1003, 0, 0, 371, 270, 631, 758, 633, 632, - 994, 0, 995, 999, 1002, 998, 996, 997, 0, 1090, - 0, 0, 0, 0, 0, 0, 960, 972, 0, 978, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 969, 970, 0, 0, 0, - 0, 1027, 0, 971, 0, 973, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 1022, 1000, 1004, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 1001, - 0, 1025, 1029, 393, 1116, 1023, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 1117, 453, 454, 455, 456, 457, 458, - 418, 1105, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 750, 1020, 0, 755, 0, 584, 0, 0, 1097, 0, - 0, 0, 554, 0, 0, 459, 0, 0, 0, 1024, - 0, 535, 508, 1113, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 0, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 2268, - 2267, 2269, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 0, 467, 468, 409, 340, 346, - 791, 1094, 504, 716, 753, 754, 638, 0, 1112, 1089, - 1091, 1092, 1096, 1101, 1102, 1103, 1104, 1106, 1108, 1111, - 1115, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 1114, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 1028, 690, 691, 492, 493, 494, 495, 1098, 717, 376, - 609, 525, 526, 0, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 1123, 1093, 1122, 1124, 1125, 1121, 1126, 1127, 1107, - 982, 0, 1035, 1036, 1119, 1118, 1120, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 989, 347, 645, - 470, 524, 407, 712, 713, 0, 768, 1083, 1046, 1047, - 1048, 979, 1049, 1043, 1044, 980, 1045, 1084, 1033, 1080, - 1081, 1008, 1038, 1050, 1079, 1051, 1082, 1009, 1085, 1128, - 1129, 1057, 1041, 303, 1130, 1054, 1086, 1078, 1077, 1052, - 1034, 1087, 1088, 1016, 1011, 1055, 1056, 1042, 1063, 1064, - 1065, 1068, 981, 1069, 1070, 1071, 1072, 1073, 1067, 1066, - 1030, 1031, 1032, 1058, 1059, 1061, 1062, 1037, 555, 1012, - 1013, 1014, 1015, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 1074, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 1060, 766, 767, 764, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 349, 0, 1039, 1040, 709, 710, 0, - 0, 1109, 486, 641, 0, 974, 341, 342, 343, 1099, - 345, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 201, 246, 1026, 0, 0, 0, 0, 0, 0, 0, - 0, 506, 0, 0, 650, 684, 673, 762, 637, 0, - 0, 0, 0, 0, 0, 977, 0, 0, 0, 400, - 0, 0, 469, 688, 669, 680, 670, 512, 655, 656, - 657, 664, 412, 658, 794, 660, 629, 661, 630, 662, - 663, 1017, 687, 636, 548, 488, 0, 704, 0, 0, - 1100, 1110, 0, 0, 0, 0, 0, 0, 0, 0, - 1095, 0, 0, 0, 0, 0, 968, 0, 0, 1006, - 1076, 1075, 993, 1003, 0, 0, 371, 270, 631, 758, - 633, 632, 994, 0, 995, 999, 1002, 998, 996, 997, - 0, 1090, 0, 0, 0, 0, 0, 0, 960, 972, - 0, 978, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 969, 970, 0, - 0, 0, 0, 1027, 0, 971, 0, 973, 0, 0, - 0, 0, 549, 577, 0, 590, 0, 438, 439, 1022, - 1000, 1004, 0, 0, 0, 0, 356, 556, 574, 372, - 543, 588, 377, 551, 567, 367, 505, 539, 0, 0, - 358, 572, 550, 483, 357, 0, 532, 397, 414, 394, - 503, 1001, 0, 1025, 1029, 393, 1116, 1023, 582, 360, - 0, 581, 502, 475, 568, 573, 484, 477, 0, 359, - 570, 482, 476, 452, 404, 1117, 453, 454, 455, 456, - 457, 458, 418, 1105, 473, 519, 419, 490, 489, 491, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, - 0, 0, 0, 0, 0, 612, 613, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 750, 1020, 0, 755, 0, 584, 0, 0, - 1097, 0, 0, 0, 554, 0, 0, 459, 0, 0, - 0, 1024, 0, 535, 508, 1113, 0, 0, 533, 471, - 569, 520, 575, 557, 583, 527, 521, 350, 558, 396, - 485, 368, 370, 783, 398, 401, 405, 406, 496, 497, - 514, 542, 561, 562, 563, 395, 382, 534, 383, 415, - 384, 351, 387, 386, 388, 544, 389, 353, 515, 566, - 0, 411, 530, 480, 354, 479, 516, 565, 564, 369, - 592, 599, 600, 692, 0, 605, 797, 798, 799, 614, - 0, 522, 365, 362, 0, 0, 0, 391, 517, 378, - 380, 381, 379, 511, 513, 619, 620, 621, 623, 624, - 625, 626, 0, 0, 0, 0, 627, 693, 711, 677, - 646, 607, 701, 643, 647, 648, 432, 433, 434, 435, - 714, 0, 0, 0, 598, 460, 461, 0, 403, 402, - 481, 355, 0, 0, 449, 431, 523, 361, 399, 451, - 437, 462, 463, 464, 465, 466, 0, 467, 468, 409, - 340, 346, 791, 1094, 504, 716, 753, 754, 638, 0, - 1112, 1089, 1091, 1092, 1096, 1101, 1102, 1103, 1104, 1106, - 1108, 1111, 1115, 790, 0, 694, 708, 795, 707, 787, - 510, 0, 541, 705, 652, 0, 698, 671, 672, 0, - 699, 667, 703, 0, 640, 0, 608, 611, 642, 729, - 730, 731, 352, 610, 733, 734, 735, 736, 737, 738, - 739, 732, 1114, 675, 651, 678, 589, 654, 653, 0, - 0, 689, 1028, 690, 691, 492, 493, 494, 495, 1098, - 717, 376, 609, 525, 526, 0, 676, 0, 0, 0, - 0, 0, 0, 0, 0, 681, 682, 679, 800, 0, - 740, 741, 0, 0, 603, 604, 408, 0, 622, 416, - 375, 509, 410, 587, 440, 0, 615, 683, 616, 528, - 529, 744, 749, 745, 746, 748, 769, 499, 430, 436, - 545, 450, 472, 531, 586, 507, 536, 373, 576, 547, - 478, 668, 696, 1123, 1093, 1122, 1124, 1125, 1121, 1126, - 1127, 1107, 982, 0, 1035, 1036, 1119, 1118, 1120, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 725, 724, 723, 722, 721, 720, 719, 718, 0, 0, - 665, 390, 788, 782, 789, 770, 773, 772, 747, 989, - 347, 645, 470, 524, 407, 712, 713, 0, 768, 1083, - 1046, 1047, 1048, 979, 1049, 1043, 1044, 980, 1045, 1084, - 1033, 1080, 1081, 1008, 1038, 1050, 1079, 1051, 1082, 1009, - 1085, 1128, 1129, 1057, 1041, 303, 1130, 1054, 1086, 1078, - 1077, 1052, 1034, 1087, 1088, 1016, 1011, 1055, 1056, 1042, - 1063, 1064, 1065, 1068, 981, 1069, 1070, 1071, 1072, 1073, - 1067, 1066, 1030, 1031, 1032, 1058, 1059, 1061, 1062, 1037, - 555, 1012, 1013, 1014, 1015, 0, 0, 593, 594, 595, - 618, 0, 596, 578, 644, 417, 348, 559, 585, 785, - 786, 0, 0, 0, 0, 0, 0, 0, 695, 706, - 742, 743, 0, 756, 757, 759, 761, 1074, 763, 552, - 553, 771, 0, 0, 441, 363, 364, 500, 501, 538, - 0, 442, 443, 444, 448, 445, 446, 447, 1060, 766, - 767, 764, 474, 537, 560, 546, 784, 487, 0, 792, - 634, 635, 793, 752, 751, 349, 0, 1039, 1040, 709, - 710, 0, 0, 1109, 486, 641, 0, 974, 341, 342, - 343, 1099, 345, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1026, 0, 0, 0, 0, 0, - 0, 0, 0, 506, 0, 0, 650, 684, 673, 762, - 637, 0, 0, 0, 0, 0, 0, 977, 0, 0, - 0, 400, 2340, 0, 469, 688, 669, 680, 670, 512, - 655, 656, 657, 664, 412, 658, 794, 660, 629, 661, - 630, 662, 663, 1017, 687, 636, 548, 488, 0, 704, - 0, 0, 1100, 1110, 0, 0, 0, 0, 0, 0, - 0, 0, 1095, 0, 2597, 0, 0, 0, 968, 0, - 0, 1006, 1076, 1075, 993, 1003, 0, 0, 371, 270, - 631, 758, 633, 632, 994, 0, 995, 999, 1002, 998, - 996, 997, 0, 1090, 0, 0, 0, 0, 0, 0, - 960, 972, 0, 978, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 969, - 970, 0, 0, 0, 0, 1027, 0, 971, 0, 973, - 0, 0, 0, 0, 549, 577, 0, 590, 0, 438, - 439, 2598, 1000, 1004, 0, 0, 0, 0, 356, 556, - 574, 372, 543, 588, 377, 551, 567, 367, 505, 539, - 0, 0, 358, 572, 550, 483, 357, 0, 532, 397, - 414, 394, 503, 1001, 0, 1025, 1029, 393, 1116, 1023, - 582, 360, 0, 581, 502, 475, 568, 573, 484, 477, - 0, 359, 570, 482, 476, 452, 404, 1117, 453, 454, - 455, 456, 457, 458, 418, 1105, 473, 519, 419, 490, - 489, 491, 420, 421, 422, 423, 424, 425, 426, 427, - 428, 429, 0, 0, 0, 0, 0, 612, 613, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 750, 1020, 0, 755, 0, 584, - 0, 0, 1097, 0, 0, 0, 554, 0, 0, 459, - 0, 0, 0, 1024, 0, 535, 508, 1113, 0, 0, - 533, 471, 569, 520, 575, 557, 583, 527, 521, 350, - 558, 396, 485, 368, 370, 783, 398, 401, 405, 406, - 496, 497, 514, 542, 561, 562, 563, 395, 382, 534, - 383, 415, 384, 351, 387, 386, 388, 544, 389, 353, - 515, 566, 0, 411, 530, 480, 354, 479, 516, 565, - 564, 369, 592, 599, 600, 692, 0, 605, 797, 798, - 799, 614, 0, 522, 365, 362, 0, 0, 0, 391, - 517, 378, 380, 381, 379, 511, 513, 619, 620, 621, - 623, 624, 625, 626, 0, 0, 0, 0, 627, 693, - 711, 677, 646, 607, 701, 643, 647, 648, 432, 433, - 434, 435, 714, 0, 0, 0, 598, 460, 461, 0, - 403, 402, 481, 355, 0, 0, 449, 431, 523, 361, - 399, 451, 437, 462, 463, 464, 465, 466, 0, 467, - 468, 409, 340, 346, 791, 1094, 504, 716, 753, 754, - 638, 0, 1112, 1089, 1091, 1092, 1096, 1101, 1102, 1103, - 1104, 1106, 1108, 1111, 1115, 790, 0, 694, 708, 795, - 707, 787, 510, 0, 541, 705, 652, 0, 698, 671, - 672, 0, 699, 667, 703, 0, 640, 0, 608, 611, - 642, 729, 730, 731, 352, 610, 733, 734, 735, 736, - 737, 738, 739, 732, 1114, 675, 651, 678, 589, 654, - 653, 0, 0, 689, 1028, 690, 691, 492, 493, 494, - 495, 1098, 717, 376, 609, 525, 526, 0, 676, 0, - 0, 0, 0, 0, 0, 0, 0, 681, 682, 679, - 800, 0, 740, 741, 0, 0, 603, 604, 408, 0, - 622, 416, 375, 509, 410, 587, 440, 0, 615, 683, - 616, 528, 529, 744, 749, 745, 746, 748, 769, 499, - 430, 436, 545, 450, 472, 531, 586, 507, 536, 373, - 576, 547, 478, 668, 696, 1123, 1093, 1122, 1124, 1125, - 1121, 1126, 1127, 1107, 982, 0, 1035, 1036, 1119, 1118, - 1120, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 725, 724, 723, 722, 721, 720, 719, 718, - 0, 0, 665, 390, 788, 782, 789, 770, 773, 772, - 747, 989, 347, 645, 470, 524, 407, 712, 713, 0, - 768, 1083, 1046, 1047, 1048, 979, 1049, 1043, 1044, 980, - 1045, 1084, 1033, 1080, 1081, 1008, 1038, 1050, 1079, 1051, - 1082, 1009, 1085, 1128, 1129, 1057, 1041, 303, 1130, 1054, - 1086, 1078, 1077, 1052, 1034, 1087, 1088, 1016, 1011, 1055, - 1056, 1042, 1063, 1064, 1065, 1068, 981, 1069, 1070, 1071, - 1072, 1073, 1067, 1066, 1030, 1031, 1032, 1058, 1059, 1061, - 1062, 1037, 555, 1012, 1013, 1014, 1015, 0, 0, 593, - 594, 595, 618, 0, 596, 578, 644, 417, 348, 559, - 585, 785, 786, 0, 0, 0, 0, 0, 0, 0, - 695, 706, 742, 743, 0, 756, 757, 759, 761, 1074, - 763, 552, 553, 771, 0, 0, 441, 363, 364, 500, - 501, 538, 0, 442, 443, 444, 448, 445, 446, 447, - 1060, 766, 767, 764, 474, 537, 560, 546, 784, 487, - 0, 792, 634, 635, 793, 752, 751, 349, 0, 1039, - 1040, 709, 710, 0, 0, 1109, 486, 641, 0, 974, - 341, 342, 343, 1099, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1026, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 977, - 0, 0, 0, 400, 5440, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 1017, 687, 636, 548, 488, - 0, 704, 0, 0, 1100, 1110, 0, 0, 0, 0, - 0, 0, 0, 0, 1095, 0, 0, 0, 0, 0, - 968, 0, 0, 1006, 1076, 1075, 993, 1003, 0, 0, - 371, 270, 631, 758, 633, 632, 994, 0, 995, 999, - 1002, 998, 996, 997, 0, 1090, 0, 0, 0, 0, - 0, 0, 960, 972, 0, 978, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 969, 970, 0, 0, 0, 0, 1027, 0, 971, - 0, 973, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 1022, 1000, 1004, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 1001, 0, 1025, 1029, 393, - 1116, 1023, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 1117, - 453, 454, 455, 456, 457, 458, 418, 1105, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 1020, 0, 755, - 0, 584, 0, 0, 1097, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 1024, 0, 535, 508, 1113, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 1094, 504, 716, - 753, 754, 638, 0, 1112, 1089, 1091, 1092, 1096, 1101, - 1102, 1103, 1104, 1106, 1108, 1111, 1115, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 1114, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 1028, 690, 691, 492, - 493, 494, 495, 1098, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 1123, 1093, 1122, - 1124, 1125, 1121, 1126, 1127, 1107, 982, 0, 1035, 1036, - 1119, 1118, 1120, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 989, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 1083, 1046, 1047, 1048, 979, 1049, 1043, - 1044, 980, 1045, 1084, 1033, 1080, 1081, 1008, 1038, 1050, - 1079, 1051, 1082, 1009, 1085, 1128, 1129, 1057, 1041, 303, - 1130, 1054, 1086, 1078, 1077, 1052, 1034, 1087, 1088, 1016, - 1011, 1055, 1056, 1042, 1063, 1064, 1065, 1068, 981, 1069, - 1070, 1071, 1072, 1073, 1067, 1066, 1030, 1031, 1032, 1058, - 1059, 1061, 1062, 1037, 555, 1012, 1013, 1014, 1015, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 1074, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 1060, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 1039, 1040, 709, 710, 0, 0, 1109, 486, 641, - 0, 974, 341, 342, 343, 1099, 345, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1026, 0, - 0, 0, 0, 0, 0, 0, 0, 506, 0, 0, - 650, 684, 673, 762, 637, 0, 0, 0, 0, 0, - 0, 977, 0, 0, 0, 400, 0, 0, 469, 688, - 669, 680, 670, 512, 655, 656, 657, 664, 412, 658, - 794, 660, 629, 661, 630, 662, 663, 1017, 687, 636, - 548, 488, 0, 704, 0, 0, 1100, 1110, 0, 0, - 0, 0, 0, 0, 0, 0, 1095, 0, 0, 0, - 0, 0, 968, 0, 0, 1006, 1076, 1075, 993, 1003, - 0, 0, 371, 270, 631, 758, 633, 632, 994, 0, - 995, 999, 1002, 998, 996, 997, 0, 1090, 0, 0, - 0, 0, 0, 0, 960, 972, 0, 978, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 969, 970, 0, 0, 0, 0, 1027, - 0, 971, 0, 973, 0, 0, 0, 0, 549, 577, - 0, 590, 0, 438, 439, 1022, 1000, 1004, 0, 0, - 0, 0, 356, 556, 574, 372, 543, 588, 377, 551, - 567, 367, 505, 539, 0, 0, 358, 572, 550, 483, - 357, 0, 532, 397, 414, 394, 503, 1001, 0, 1025, - 1029, 393, 1116, 1023, 582, 360, 0, 581, 502, 475, - 568, 573, 484, 477, 0, 359, 570, 482, 476, 452, - 404, 1117, 453, 454, 455, 456, 457, 458, 418, 1105, - 473, 519, 419, 490, 489, 491, 420, 421, 422, 423, - 424, 425, 426, 427, 428, 429, 0, 0, 0, 0, - 0, 612, 613, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 750, 1020, - 0, 755, 0, 584, 0, 0, 1097, 0, 0, 0, - 554, 0, 0, 459, 0, 0, 0, 1024, 0, 535, - 508, 1113, 5246, 0, 533, 471, 569, 520, 575, 557, - 583, 527, 521, 350, 558, 396, 485, 368, 370, 783, - 398, 401, 405, 406, 496, 497, 514, 542, 561, 562, - 563, 395, 382, 534, 383, 415, 384, 351, 387, 386, - 388, 544, 389, 353, 515, 566, 0, 411, 530, 480, - 354, 479, 516, 565, 564, 369, 592, 599, 600, 692, - 0, 605, 797, 798, 799, 614, 0, 522, 365, 362, - 0, 0, 0, 391, 517, 378, 380, 381, 379, 511, - 513, 619, 620, 621, 623, 624, 625, 626, 0, 0, - 0, 0, 627, 693, 711, 677, 646, 607, 701, 643, - 647, 648, 432, 433, 434, 435, 714, 0, 0, 0, - 598, 460, 461, 0, 403, 402, 481, 355, 0, 0, - 449, 431, 523, 361, 399, 451, 437, 462, 463, 464, - 465, 466, 0, 467, 468, 409, 340, 346, 791, 1094, - 504, 716, 753, 754, 638, 0, 1112, 1089, 1091, 1092, - 1096, 1101, 1102, 1103, 1104, 1106, 1108, 1111, 1115, 790, - 0, 694, 708, 795, 707, 787, 510, 0, 541, 705, - 652, 0, 698, 671, 672, 0, 699, 667, 703, 0, - 640, 0, 608, 611, 642, 729, 730, 731, 352, 610, - 733, 734, 735, 736, 737, 738, 739, 732, 1114, 675, - 651, 678, 589, 654, 653, 0, 0, 689, 1028, 690, - 691, 492, 493, 494, 495, 1098, 717, 376, 609, 525, - 526, 0, 676, 0, 0, 0, 0, 0, 0, 0, - 0, 681, 682, 679, 800, 0, 740, 741, 0, 0, - 603, 604, 408, 0, 622, 416, 375, 509, 410, 587, - 440, 0, 615, 683, 616, 528, 529, 744, 749, 745, - 746, 748, 769, 499, 430, 436, 545, 450, 472, 531, - 586, 507, 536, 373, 576, 547, 478, 668, 696, 1123, - 1093, 1122, 1124, 1125, 1121, 1126, 1127, 1107, 982, 0, - 1035, 1036, 1119, 1118, 1120, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 725, 724, 723, 722, - 721, 720, 719, 718, 0, 0, 665, 390, 788, 782, - 789, 770, 773, 772, 747, 989, 347, 645, 470, 524, - 407, 712, 713, 0, 768, 1083, 1046, 1047, 1048, 979, - 1049, 1043, 1044, 980, 1045, 1084, 1033, 1080, 1081, 1008, - 1038, 1050, 1079, 1051, 1082, 1009, 1085, 1128, 1129, 1057, - 1041, 303, 1130, 1054, 1086, 1078, 1077, 1052, 1034, 1087, - 1088, 1016, 1011, 1055, 1056, 1042, 1063, 1064, 1065, 1068, - 981, 1069, 1070, 1071, 1072, 1073, 1067, 1066, 1030, 1031, - 1032, 1058, 1059, 1061, 1062, 1037, 555, 1012, 1013, 1014, - 1015, 0, 0, 593, 594, 595, 618, 0, 596, 578, - 644, 417, 348, 559, 585, 785, 786, 0, 0, 0, - 0, 0, 0, 0, 695, 706, 742, 743, 0, 756, - 757, 759, 761, 1074, 763, 552, 553, 771, 0, 0, - 441, 363, 364, 500, 501, 538, 0, 442, 443, 444, - 448, 445, 446, 447, 1060, 766, 767, 764, 474, 537, - 560, 546, 784, 487, 0, 792, 634, 635, 793, 752, - 751, 349, 0, 1039, 1040, 709, 710, 0, 0, 1109, - 486, 641, 0, 974, 341, 342, 343, 1099, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1026, 0, 0, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 0, 0, - 0, 0, 0, 977, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 1017, - 687, 636, 548, 488, 0, 704, 0, 0, 1100, 1110, - 0, 0, 0, 0, 0, 0, 0, 0, 1095, 0, - 0, 0, 0, 0, 968, 0, 0, 1006, 1076, 1075, - 993, 1003, 0, 0, 371, 270, 631, 758, 633, 632, - 994, 0, 995, 999, 1002, 998, 996, 997, 0, 1090, - 0, 0, 0, 0, 0, 0, 960, 972, 0, 978, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 969, 970, 1934, 0, 0, - 0, 1027, 0, 971, 0, 973, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 1022, 1000, 1004, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 1001, - 0, 1025, 1029, 393, 1116, 1023, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 1117, 453, 454, 455, 456, 457, 458, - 418, 1105, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 750, 1020, 0, 755, 0, 584, 0, 0, 1097, 0, - 0, 0, 554, 0, 0, 459, 0, 0, 0, 1024, - 0, 535, 508, 1113, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 0, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 0, 467, 468, 409, 340, 346, - 791, 1094, 504, 716, 753, 754, 638, 0, 1112, 1089, - 1091, 1092, 1096, 1101, 1102, 1103, 1104, 1106, 1108, 1111, - 1115, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 1114, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 1028, 690, 691, 492, 493, 494, 495, 1098, 717, 376, - 609, 525, 526, 0, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 1123, 1093, 1122, 1124, 1125, 1121, 1126, 1127, 1107, - 982, 0, 1035, 1036, 1119, 1118, 1120, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 989, 347, 645, - 470, 524, 407, 712, 713, 0, 768, 1083, 1046, 1047, - 1048, 979, 1049, 1043, 1044, 980, 1045, 1084, 1033, 1080, - 1081, 1008, 1038, 1050, 1079, 1051, 1082, 1009, 1085, 1128, - 1129, 1057, 1041, 303, 1130, 1054, 1086, 1078, 1077, 1052, - 1034, 1087, 1088, 1016, 1011, 1055, 1056, 1042, 1063, 1064, - 1065, 1068, 981, 1069, 1070, 1071, 1072, 1073, 1067, 1066, - 1030, 1031, 1032, 1058, 1059, 1061, 1062, 1037, 555, 1012, - 1013, 1014, 1015, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 1074, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 1060, 766, 767, 764, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 349, 0, 1039, 1040, 709, 710, 0, - 0, 1109, 486, 641, 0, 974, 341, 342, 343, 1099, - 345, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1026, 0, 0, 0, 0, 0, 0, 0, - 0, 506, 0, 0, 650, 684, 673, 762, 637, 0, - 0, 0, 0, 0, 0, 977, 0, 0, 0, 400, - 2340, 0, 469, 688, 669, 680, 670, 512, 655, 656, - 657, 664, 412, 658, 794, 660, 629, 661, 630, 662, - 663, 1017, 687, 636, 548, 488, 0, 704, 0, 0, - 1100, 1110, 0, 0, 0, 0, 0, 0, 0, 0, - 1095, 0, 0, 0, 0, 0, 968, 0, 0, 1006, - 1076, 1075, 993, 1003, 0, 0, 371, 270, 631, 758, - 633, 632, 994, 0, 995, 999, 1002, 998, 996, 997, - 0, 1090, 0, 0, 0, 0, 0, 0, 960, 972, - 0, 978, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 969, 970, 0, - 0, 0, 0, 1027, 0, 971, 0, 973, 0, 0, - 0, 0, 549, 577, 0, 590, 0, 438, 439, 1022, - 1000, 1004, 0, 0, 0, 0, 356, 556, 574, 372, - 543, 588, 377, 551, 567, 367, 505, 539, 0, 0, - 358, 572, 550, 483, 357, 0, 532, 397, 414, 394, - 503, 1001, 0, 1025, 1029, 393, 1116, 1023, 582, 360, - 0, 581, 502, 475, 568, 573, 484, 477, 0, 359, - 570, 482, 476, 452, 404, 1117, 453, 454, 455, 456, - 457, 458, 418, 1105, 473, 519, 419, 490, 489, 491, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, - 0, 0, 0, 0, 0, 612, 613, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 750, 1020, 0, 755, 0, 584, 0, 0, - 1097, 0, 0, 0, 554, 0, 0, 459, 0, 0, - 0, 1024, 0, 535, 508, 1113, 0, 0, 533, 471, - 569, 520, 575, 557, 583, 527, 521, 350, 558, 396, - 485, 368, 370, 783, 398, 401, 405, 406, 496, 497, - 514, 542, 561, 562, 563, 395, 382, 534, 383, 415, - 384, 351, 387, 386, 388, 544, 389, 353, 515, 566, - 0, 411, 530, 480, 354, 479, 516, 565, 564, 369, - 592, 599, 600, 692, 0, 605, 797, 798, 799, 614, - 0, 522, 365, 362, 0, 0, 0, 391, 517, 378, - 380, 381, 379, 511, 513, 619, 620, 621, 623, 624, - 625, 626, 0, 0, 0, 0, 627, 693, 711, 677, - 646, 607, 701, 643, 647, 648, 432, 433, 434, 435, - 714, 0, 0, 0, 598, 460, 461, 0, 403, 402, - 481, 355, 0, 0, 449, 431, 523, 361, 399, 451, - 437, 462, 463, 464, 465, 466, 0, 467, 468, 409, - 340, 346, 791, 1094, 504, 716, 753, 754, 638, 0, - 1112, 1089, 1091, 1092, 1096, 1101, 1102, 1103, 1104, 1106, - 1108, 1111, 1115, 790, 0, 694, 708, 795, 707, 787, - 510, 0, 541, 705, 652, 0, 698, 671, 672, 0, - 699, 667, 703, 0, 640, 0, 608, 611, 642, 729, - 730, 731, 352, 610, 733, 734, 735, 736, 737, 738, - 739, 732, 1114, 675, 651, 678, 589, 654, 653, 0, - 0, 689, 1028, 690, 691, 492, 493, 494, 495, 1098, - 717, 376, 609, 525, 526, 0, 676, 0, 0, 0, - 0, 0, 0, 0, 0, 681, 682, 679, 800, 0, - 740, 741, 0, 0, 603, 604, 408, 0, 622, 416, - 375, 509, 410, 587, 440, 0, 615, 683, 616, 528, - 529, 744, 749, 745, 746, 748, 769, 499, 430, 436, - 545, 450, 472, 531, 586, 507, 536, 373, 576, 547, - 478, 668, 696, 1123, 1093, 1122, 1124, 1125, 1121, 1126, - 1127, 1107, 982, 0, 1035, 1036, 1119, 1118, 1120, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 725, 724, 723, 722, 721, 720, 719, 718, 0, 0, - 665, 390, 788, 782, 789, 770, 773, 772, 747, 989, - 347, 645, 470, 524, 407, 712, 713, 0, 768, 1083, - 1046, 1047, 1048, 979, 1049, 1043, 1044, 980, 1045, 1084, - 1033, 1080, 1081, 1008, 1038, 1050, 1079, 1051, 1082, 1009, - 1085, 1128, 1129, 1057, 1041, 303, 1130, 1054, 1086, 1078, - 1077, 1052, 1034, 1087, 1088, 1016, 1011, 1055, 1056, 1042, - 1063, 1064, 1065, 1068, 981, 1069, 1070, 1071, 1072, 1073, - 1067, 1066, 1030, 1031, 1032, 1058, 1059, 1061, 1062, 1037, - 555, 1012, 1013, 1014, 1015, 0, 0, 593, 594, 595, - 618, 0, 596, 578, 644, 417, 348, 559, 585, 785, - 786, 0, 0, 0, 0, 0, 0, 0, 695, 706, - 742, 743, 0, 756, 757, 759, 761, 1074, 763, 552, - 553, 771, 0, 0, 441, 363, 364, 500, 501, 538, - 0, 442, 443, 444, 448, 445, 446, 447, 1060, 766, - 767, 764, 474, 537, 560, 546, 784, 487, 0, 792, - 634, 635, 793, 752, 751, 349, 0, 1039, 1040, 709, - 710, 0, 0, 1109, 486, 641, 0, 974, 341, 342, - 343, 1099, 345, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1026, 0, 0, 2846, 0, 0, - 0, 0, 0, 506, 0, 0, 650, 684, 673, 762, - 637, 0, 0, 0, 0, 0, 0, 977, 0, 0, - 0, 400, 0, 0, 469, 688, 669, 680, 670, 512, - 655, 656, 657, 664, 412, 658, 794, 660, 629, 661, - 630, 662, 663, 1017, 687, 636, 548, 488, 0, 704, - 0, 0, 1100, 1110, 0, 0, 0, 0, 0, 0, - 0, 0, 1095, 0, 0, 0, 0, 0, 968, 0, - 0, 1006, 1076, 1075, 993, 1003, 0, 0, 371, 270, - 631, 758, 633, 632, 994, 0, 995, 999, 1002, 998, - 996, 997, 0, 1090, 0, 0, 0, 0, 0, 0, - 960, 972, 0, 978, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 969, - 970, 0, 0, 0, 0, 1027, 0, 971, 0, 973, - 0, 0, 0, 0, 549, 577, 0, 590, 0, 438, - 439, 1022, 1000, 1004, 0, 0, 0, 0, 356, 556, - 574, 372, 543, 588, 377, 551, 567, 367, 505, 539, - 0, 0, 358, 572, 550, 483, 357, 0, 532, 397, - 414, 394, 503, 1001, 0, 1025, 1029, 393, 1116, 1023, - 582, 360, 0, 581, 502, 475, 568, 573, 484, 477, - 0, 359, 570, 482, 476, 452, 404, 1117, 453, 454, - 455, 456, 457, 458, 418, 1105, 473, 519, 419, 490, - 489, 491, 420, 421, 422, 423, 424, 425, 426, 427, - 428, 429, 0, 0, 0, 0, 0, 612, 613, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 750, 1020, 0, 755, 0, 584, - 0, 0, 1097, 0, 0, 0, 554, 0, 0, 459, - 0, 0, 0, 1024, 0, 535, 508, 1113, 0, 0, - 533, 471, 569, 520, 575, 557, 583, 527, 521, 350, - 558, 396, 485, 368, 370, 783, 398, 401, 405, 406, - 496, 497, 514, 542, 561, 562, 563, 395, 382, 534, - 383, 415, 384, 351, 387, 386, 388, 544, 389, 353, - 515, 566, 0, 411, 530, 480, 354, 479, 516, 565, - 564, 369, 592, 599, 600, 692, 0, 605, 797, 798, - 799, 614, 0, 522, 365, 362, 0, 0, 0, 391, - 517, 378, 380, 381, 379, 511, 513, 619, 620, 621, - 623, 624, 625, 626, 0, 0, 0, 0, 627, 693, - 711, 677, 646, 607, 701, 643, 647, 648, 432, 433, - 434, 435, 714, 0, 0, 0, 598, 460, 461, 0, - 403, 402, 481, 355, 0, 0, 449, 431, 523, 361, - 399, 451, 437, 462, 463, 464, 465, 466, 0, 467, - 468, 409, 340, 346, 791, 1094, 504, 716, 753, 754, - 638, 0, 1112, 1089, 1091, 1092, 1096, 1101, 1102, 1103, - 1104, 1106, 1108, 1111, 1115, 790, 0, 694, 708, 795, - 707, 787, 510, 0, 541, 705, 652, 0, 698, 671, - 672, 0, 699, 667, 703, 0, 640, 0, 608, 611, - 642, 729, 730, 731, 352, 610, 733, 734, 735, 736, - 737, 738, 739, 732, 1114, 675, 651, 678, 589, 654, - 653, 0, 0, 689, 1028, 690, 691, 492, 493, 494, - 495, 1098, 717, 376, 609, 525, 526, 0, 676, 0, - 0, 0, 0, 0, 0, 0, 0, 681, 682, 679, - 800, 0, 740, 741, 0, 0, 603, 604, 408, 0, - 622, 416, 375, 509, 410, 587, 440, 0, 615, 683, - 616, 528, 529, 744, 749, 745, 746, 748, 769, 499, - 430, 436, 545, 450, 472, 531, 586, 507, 536, 373, - 576, 547, 478, 668, 696, 1123, 1093, 1122, 1124, 1125, - 1121, 1126, 1127, 1107, 982, 0, 1035, 1036, 1119, 1118, - 1120, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 725, 724, 723, 722, 721, 720, 719, 718, - 0, 0, 665, 390, 788, 782, 789, 770, 773, 772, - 747, 989, 347, 645, 470, 524, 407, 712, 713, 0, - 768, 1083, 1046, 1047, 1048, 979, 1049, 1043, 1044, 980, - 1045, 1084, 1033, 1080, 1081, 1008, 1038, 1050, 1079, 1051, - 1082, 1009, 1085, 1128, 1129, 1057, 1041, 303, 1130, 1054, - 1086, 1078, 1077, 1052, 1034, 1087, 1088, 1016, 1011, 1055, - 1056, 1042, 1063, 1064, 1065, 1068, 981, 1069, 1070, 1071, - 1072, 1073, 1067, 1066, 1030, 1031, 1032, 1058, 1059, 1061, - 1062, 1037, 555, 1012, 1013, 1014, 1015, 0, 0, 593, - 594, 595, 618, 0, 596, 578, 644, 417, 348, 559, - 585, 785, 786, 0, 0, 0, 0, 0, 0, 0, - 695, 706, 742, 743, 0, 756, 757, 759, 761, 1074, - 763, 552, 553, 771, 0, 0, 441, 363, 364, 500, - 501, 538, 0, 442, 443, 444, 448, 445, 446, 447, - 1060, 766, 767, 764, 474, 537, 560, 546, 784, 487, - 0, 792, 634, 635, 793, 752, 751, 349, 0, 1039, - 1040, 709, 710, 0, 0, 1109, 486, 641, 0, 974, - 341, 342, 343, 1099, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1026, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 977, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 1017, 687, 636, 548, 488, - 0, 704, 0, 0, 1100, 1110, 0, 0, 0, 0, - 0, 0, 0, 0, 1095, 0, 0, 0, 0, 0, - 968, 0, 0, 1006, 1076, 1075, 993, 1003, 0, 0, - 371, 270, 631, 758, 633, 632, 994, 0, 995, 999, - 1002, 998, 996, 997, 0, 1090, 0, 0, 0, 0, - 0, 0, 960, 972, 0, 978, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 969, 970, 2331, 0, 0, 0, 1027, 0, 971, - 0, 973, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 1022, 1000, 1004, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 1001, 0, 1025, 1029, 393, - 1116, 1023, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 1117, - 453, 454, 455, 456, 457, 458, 418, 1105, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 1020, 0, 755, - 0, 584, 0, 0, 1097, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 1024, 0, 535, 508, 1113, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 1094, 504, 716, - 753, 754, 638, 0, 1112, 1089, 1091, 1092, 1096, 1101, - 1102, 1103, 1104, 1106, 1108, 1111, 1115, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 1114, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 1028, 690, 691, 492, - 493, 494, 495, 1098, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 1123, 1093, 1122, - 1124, 1125, 1121, 1126, 1127, 1107, 982, 0, 1035, 1036, - 1119, 1118, 1120, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 989, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 1083, 1046, 1047, 1048, 979, 1049, 1043, - 1044, 980, 1045, 1084, 1033, 1080, 1081, 1008, 1038, 1050, - 1079, 1051, 1082, 1009, 1085, 1128, 1129, 1057, 1041, 303, - 1130, 1054, 1086, 1078, 1077, 1052, 1034, 1087, 1088, 1016, - 1011, 1055, 1056, 1042, 1063, 1064, 1065, 1068, 981, 1069, - 1070, 1071, 1072, 1073, 1067, 1066, 1030, 1031, 1032, 1058, - 1059, 1061, 1062, 1037, 555, 1012, 1013, 1014, 1015, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 1074, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 1060, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 1039, 1040, 709, 710, 0, 0, 1109, 486, 641, - 0, 974, 341, 342, 343, 1099, 345, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1026, 0, - 0, 0, 0, 0, 0, 0, 0, 506, 0, 0, - 650, 684, 673, 762, 637, 0, 0, 0, 0, 0, - 0, 977, 0, 0, 0, 400, 0, 0, 469, 688, - 669, 680, 670, 512, 655, 656, 657, 664, 412, 658, - 794, 660, 629, 661, 630, 662, 663, 1017, 687, 636, - 548, 488, 0, 704, 0, 0, 1100, 1110, 0, 0, - 0, 0, 0, 0, 0, 0, 1095, 0, 0, 0, - 0, 0, 968, 0, 0, 1006, 1076, 1075, 993, 1003, - 0, 0, 371, 270, 631, 758, 633, 632, 994, 0, - 995, 999, 1002, 998, 996, 997, 0, 1090, 0, 0, - 0, 0, 0, 0, 960, 972, 0, 978, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 969, 970, 0, 0, 0, 0, 1027, - 0, 971, 0, 973, 0, 0, 0, 0, 549, 577, - 0, 590, 0, 438, 439, 1022, 1000, 1004, 0, 0, - 0, 0, 356, 556, 574, 372, 543, 588, 377, 551, - 567, 367, 505, 539, 0, 0, 358, 572, 550, 483, - 357, 0, 532, 397, 414, 394, 503, 1001, 0, 1025, - 1029, 393, 1116, 1023, 582, 360, 0, 581, 502, 475, - 568, 573, 484, 477, 0, 359, 570, 482, 476, 452, - 404, 1117, 453, 454, 455, 456, 457, 458, 418, 1105, - 473, 519, 419, 490, 489, 491, 420, 421, 422, 423, - 424, 425, 426, 427, 428, 429, 0, 0, 0, 0, - 0, 612, 613, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 750, 1020, - 0, 755, 0, 584, 0, 0, 1097, 0, 0, 0, - 554, 0, 0, 459, 0, 0, 0, 1024, 0, 535, - 508, 1113, 0, 0, 533, 471, 569, 520, 575, 557, - 583, 527, 521, 350, 558, 396, 485, 368, 370, 783, - 398, 401, 405, 406, 496, 497, 514, 542, 561, 562, - 563, 395, 382, 534, 383, 415, 384, 351, 387, 386, - 388, 544, 389, 353, 515, 566, 0, 411, 530, 480, - 354, 479, 516, 565, 564, 369, 592, 599, 600, 692, - 0, 605, 797, 798, 799, 614, 0, 522, 365, 362, - 0, 0, 0, 391, 517, 378, 380, 381, 379, 511, - 513, 619, 620, 621, 623, 624, 625, 626, 0, 0, - 0, 0, 627, 693, 711, 677, 646, 607, 701, 643, - 647, 648, 432, 433, 434, 435, 714, 0, 0, 0, - 598, 460, 461, 0, 403, 402, 481, 355, 0, 0, - 449, 431, 523, 361, 399, 451, 437, 462, 463, 464, - 465, 466, 0, 467, 468, 409, 340, 346, 791, 1094, - 504, 716, 753, 754, 638, 0, 1112, 1089, 1091, 1092, - 1096, 1101, 1102, 1103, 1104, 1106, 1108, 1111, 1115, 790, - 0, 694, 708, 795, 707, 787, 510, 0, 541, 705, - 652, 0, 698, 671, 672, 0, 699, 667, 703, 0, - 640, 0, 608, 611, 642, 729, 730, 731, 352, 610, - 733, 734, 735, 736, 737, 738, 739, 732, 1114, 675, - 651, 678, 589, 654, 653, 0, 0, 689, 1028, 690, - 691, 492, 493, 494, 495, 1098, 717, 376, 609, 525, - 526, 0, 676, 0, 0, 0, 0, 0, 0, 0, - 0, 681, 682, 679, 800, 0, 740, 741, 0, 0, - 603, 604, 408, 0, 622, 416, 375, 509, 410, 587, - 440, 0, 615, 683, 616, 528, 529, 744, 749, 745, - 746, 748, 769, 499, 430, 436, 545, 450, 472, 531, - 586, 507, 536, 373, 576, 547, 478, 668, 696, 1123, - 1093, 1122, 1124, 1125, 1121, 1126, 1127, 1107, 982, 0, - 1035, 1036, 1119, 1118, 1120, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 725, 724, 723, 722, - 721, 720, 719, 718, 0, 0, 665, 390, 788, 782, - 789, 770, 773, 772, 747, 989, 347, 645, 470, 524, - 407, 712, 713, 0, 768, 1083, 1046, 1047, 1048, 979, - 1049, 1043, 1044, 980, 1045, 1084, 1033, 1080, 1081, 1008, - 1038, 1050, 1079, 1051, 1082, 1009, 1085, 1128, 1129, 1057, - 1041, 303, 1130, 1054, 1086, 1078, 1077, 1052, 1034, 1087, - 1088, 1016, 1011, 1055, 1056, 1042, 1063, 1064, 1065, 1068, - 981, 1069, 1070, 1071, 1072, 1073, 1067, 1066, 1030, 1031, - 1032, 1058, 1059, 1061, 1062, 1037, 555, 1012, 1013, 1014, - 1015, 0, 0, 593, 594, 595, 618, 0, 596, 578, - 644, 417, 348, 559, 585, 785, 786, 0, 0, 0, - 0, 0, 0, 0, 695, 706, 742, 743, 0, 756, - 757, 759, 761, 1074, 763, 552, 553, 771, 0, 0, - 441, 363, 364, 500, 501, 538, 0, 442, 443, 444, - 448, 445, 446, 447, 1060, 766, 767, 764, 474, 537, - 560, 546, 784, 487, 0, 792, 634, 635, 793, 752, - 751, 349, 0, 1039, 1040, 709, 710, 0, 0, 1109, - 486, 641, 0, 974, 341, 342, 343, 1099, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1026, 0, 0, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 0, 0, - 0, 0, 0, 977, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 1017, - 687, 636, 548, 488, 0, 704, 0, 0, 1100, 1110, - 0, 0, 0, 0, 0, 0, 0, 0, 1095, 0, - 0, 0, 0, 0, 968, 0, 0, 1006, 1076, 1075, - 993, 1003, 0, 0, 371, 270, 631, 758, 633, 632, - 994, 0, 995, 999, 1002, 998, 996, 997, 0, 1090, - 0, 0, 0, 0, 0, 0, 960, 972, 0, 978, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 969, 970, 0, 0, 0, - 0, 1027, 0, 971, 0, 973, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 1022, 1000, 1004, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 1001, - 0, 1025, 1029, 393, 1116, 1023, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 1117, 453, 454, 455, 456, 457, 458, - 418, 1105, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 750, 1020, 0, 755, 0, 584, 0, 0, 1097, 0, - 0, 0, 554, 0, 0, 459, 0, 0, 0, 1024, - 0, 535, 508, 1113, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 0, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 0, 467, 468, 409, 340, 346, - 791, 1094, 504, 716, 753, 754, 638, 0, 1112, 1089, - 1091, 1092, 1096, 1101, 1102, 1103, 1104, 1106, 1108, 1111, - 1115, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 1114, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 1028, 690, 691, 492, 493, 494, 495, 1098, 717, 376, - 609, 525, 526, 0, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 1123, 1093, 1122, 1124, 1125, 1121, 1126, 1127, 1107, - 982, 0, 1035, 1036, 1119, 1118, 1120, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 989, 347, 645, - 470, 524, 407, 712, 713, 0, 768, 1083, 1046, 1047, - 1048, 979, 1049, 1043, 1044, 980, 1045, 1084, 1033, 1080, - 1081, 1008, 1038, 1050, 1079, 1051, 1082, 1009, 1085, 1128, - 1129, 1057, 1041, 303, 1130, 1054, 1086, 1078, 1077, 1052, - 1034, 1087, 1088, 1016, 1011, 1055, 1056, 1042, 1063, 1064, - 1065, 1068, 981, 1069, 1070, 1071, 1072, 1073, 1067, 1066, - 1030, 1031, 1032, 1058, 1059, 1061, 1062, 1037, 555, 1012, - 1013, 1014, 1015, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 1074, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 4836, 766, 4837, 4838, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 349, 0, 1039, 1040, 709, 710, 0, - 0, 1109, 486, 641, 0, 974, 341, 342, 343, 1099, - 345, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1026, 0, 0, 0, 0, 0, 0, 0, - 0, 506, 0, 0, 650, 684, 673, 762, 637, 0, - 0, 0, 0, 0, 0, 977, 0, 0, 0, 400, - 0, 0, 469, 688, 669, 680, 670, 512, 655, 656, - 657, 664, 412, 658, 794, 660, 629, 661, 630, 662, - 663, 1017, 687, 636, 548, 488, 0, 704, 0, 0, - 1100, 1110, 0, 0, 0, 0, 0, 0, 0, 0, - 1095, 0, 0, 0, 0, 0, 968, 0, 0, 1006, - 1076, 1075, 993, 1003, 0, 0, 371, 270, 631, 758, - 633, 632, 3426, 0, 3427, 999, 1002, 998, 996, 997, - 0, 1090, 0, 0, 0, 0, 0, 0, 960, 972, - 0, 978, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 969, 970, 0, - 0, 0, 0, 1027, 0, 971, 0, 973, 0, 0, - 0, 0, 549, 577, 0, 590, 0, 438, 439, 1022, - 1000, 1004, 0, 0, 0, 0, 356, 556, 574, 372, - 543, 588, 377, 551, 567, 367, 505, 539, 0, 0, - 358, 572, 550, 483, 357, 0, 532, 397, 414, 394, - 503, 1001, 0, 1025, 1029, 393, 1116, 1023, 582, 360, - 0, 581, 502, 475, 568, 573, 484, 477, 0, 359, - 570, 482, 476, 452, 404, 1117, 453, 454, 455, 456, - 457, 458, 418, 1105, 473, 519, 419, 490, 489, 491, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, - 0, 0, 0, 0, 0, 612, 613, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 750, 1020, 0, 755, 0, 584, 0, 0, - 1097, 0, 0, 0, 554, 0, 0, 459, 0, 0, - 0, 1024, 0, 535, 508, 1113, 0, 0, 533, 471, - 569, 520, 575, 557, 583, 527, 521, 350, 558, 396, - 485, 368, 370, 783, 398, 401, 405, 406, 496, 497, - 514, 542, 561, 562, 563, 395, 382, 534, 383, 415, - 384, 351, 387, 386, 388, 544, 389, 353, 515, 566, - 0, 411, 530, 480, 354, 479, 516, 565, 564, 369, - 592, 599, 600, 692, 0, 605, 797, 798, 799, 614, - 0, 522, 365, 362, 0, 0, 0, 391, 517, 378, - 380, 381, 379, 511, 513, 619, 620, 621, 623, 624, - 625, 626, 0, 0, 0, 0, 627, 693, 711, 677, - 646, 607, 701, 643, 647, 648, 432, 433, 434, 435, - 714, 0, 0, 0, 598, 460, 461, 0, 403, 402, - 481, 355, 0, 0, 449, 431, 523, 361, 399, 451, - 437, 462, 463, 464, 465, 466, 0, 467, 468, 409, - 340, 346, 791, 1094, 504, 716, 753, 754, 638, 0, - 1112, 1089, 1091, 1092, 1096, 1101, 1102, 1103, 1104, 1106, - 1108, 1111, 1115, 790, 0, 694, 708, 795, 707, 787, - 510, 0, 541, 705, 652, 0, 698, 671, 672, 0, - 699, 667, 703, 0, 640, 0, 608, 611, 642, 729, - 730, 731, 352, 610, 733, 734, 735, 736, 737, 738, - 739, 732, 1114, 675, 651, 678, 589, 654, 653, 0, - 0, 689, 1028, 690, 691, 492, 493, 494, 495, 1098, - 717, 376, 609, 525, 526, 0, 676, 0, 0, 0, - 0, 0, 0, 0, 0, 681, 682, 679, 800, 0, - 740, 741, 0, 0, 603, 604, 408, 0, 622, 416, - 375, 509, 410, 587, 440, 0, 615, 683, 616, 528, - 529, 744, 749, 745, 746, 748, 769, 499, 430, 436, - 545, 450, 472, 531, 586, 507, 536, 373, 576, 547, - 478, 668, 696, 1123, 1093, 1122, 1124, 1125, 1121, 1126, - 1127, 1107, 982, 0, 1035, 1036, 1119, 1118, 1120, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 725, 724, 723, 722, 721, 720, 719, 718, 0, 0, - 665, 390, 788, 782, 789, 770, 773, 772, 747, 989, - 347, 645, 470, 524, 407, 712, 713, 0, 768, 1083, - 1046, 1047, 1048, 979, 1049, 1043, 1044, 980, 1045, 1084, - 1033, 1080, 1081, 1008, 1038, 1050, 1079, 1051, 1082, 1009, - 1085, 1128, 1129, 1057, 1041, 303, 1130, 1054, 1086, 1078, - 1077, 1052, 1034, 1087, 1088, 1016, 1011, 1055, 1056, 1042, - 1063, 1064, 1065, 1068, 981, 1069, 1070, 1071, 1072, 1073, - 1067, 1066, 1030, 1031, 1032, 1058, 1059, 1061, 1062, 1037, - 555, 1012, 1013, 1014, 1015, 0, 0, 593, 594, 595, - 618, 0, 596, 578, 644, 417, 348, 559, 585, 785, - 786, 0, 0, 0, 0, 0, 0, 0, 695, 706, - 742, 743, 0, 756, 757, 759, 761, 1074, 763, 552, - 553, 771, 0, 0, 441, 363, 364, 500, 501, 538, - 0, 442, 443, 444, 448, 445, 446, 447, 1060, 766, - 767, 764, 474, 537, 560, 546, 784, 487, 0, 792, - 634, 635, 793, 752, 751, 349, 0, 1039, 1040, 709, - 710, 0, 0, 1109, 486, 641, 0, 974, 341, 342, - 343, 1099, 345, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1026, 0, 0, 0, 0, 0, - 0, 0, 0, 506, 0, 0, 650, 684, 673, 762, - 637, 0, 0, 2161, 0, 0, 0, 977, 0, 0, - 0, 400, 0, 0, 469, 688, 669, 680, 670, 512, - 655, 656, 657, 664, 412, 658, 794, 660, 629, 661, - 630, 662, 663, 1017, 687, 636, 548, 488, 0, 704, - 0, 0, 1100, 1110, 0, 0, 0, 0, 0, 0, - 0, 0, 1095, 0, 0, 0, 0, 0, 968, 0, - 0, 1006, 1076, 1075, 993, 1003, 0, 0, 371, 270, - 631, 758, 633, 632, 994, 0, 995, 999, 1002, 998, - 996, 997, 0, 1090, 0, 0, 0, 0, 0, 0, - 0, 972, 0, 978, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 969, - 970, 0, 0, 0, 0, 1027, 0, 971, 0, 973, - 0, 0, 0, 0, 549, 577, 0, 590, 0, 438, - 439, 1022, 1000, 1004, 0, 0, 0, 0, 356, 556, - 574, 372, 543, 588, 377, 551, 567, 367, 505, 539, - 0, 0, 358, 572, 550, 483, 357, 0, 532, 397, - 414, 394, 503, 1001, 0, 1025, 1029, 393, 1116, 1023, - 582, 360, 0, 581, 502, 475, 568, 573, 484, 477, - 0, 359, 570, 482, 476, 452, 404, 1117, 453, 454, - 455, 456, 457, 458, 418, 1105, 473, 519, 419, 490, - 489, 491, 420, 421, 422, 423, 424, 425, 426, 427, - 428, 429, 0, 0, 0, 0, 0, 612, 613, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 750, 1020, 0, 755, 0, 584, - 0, 0, 1097, 0, 0, 0, 554, 0, 0, 459, - 0, 0, 0, 1024, 0, 535, 508, 1113, 0, 0, - 533, 471, 569, 520, 575, 557, 583, 527, 521, 350, - 558, 396, 485, 368, 370, 783, 398, 401, 405, 406, - 496, 497, 514, 542, 561, 562, 563, 395, 382, 534, - 383, 415, 384, 351, 387, 386, 388, 544, 389, 353, - 515, 566, 0, 411, 530, 480, 354, 479, 516, 565, - 564, 369, 592, 2162, 2163, 692, 0, 605, 797, 798, - 799, 614, 0, 522, 365, 362, 0, 0, 0, 391, - 517, 378, 380, 381, 379, 511, 513, 619, 620, 621, - 623, 624, 625, 626, 0, 0, 0, 0, 627, 693, - 711, 677, 646, 607, 701, 643, 647, 648, 432, 433, - 434, 435, 714, 0, 0, 0, 598, 460, 461, 0, - 403, 402, 481, 355, 0, 0, 449, 431, 523, 361, - 399, 451, 437, 462, 463, 464, 465, 466, 0, 467, - 468, 409, 340, 346, 791, 1094, 504, 716, 753, 754, - 638, 0, 1112, 1089, 1091, 1092, 1096, 1101, 1102, 1103, - 1104, 1106, 1108, 1111, 1115, 790, 0, 694, 708, 795, - 707, 787, 510, 0, 541, 705, 652, 0, 698, 671, - 672, 0, 699, 667, 703, 0, 640, 0, 608, 611, - 642, 729, 730, 731, 352, 610, 733, 734, 735, 736, - 737, 738, 739, 732, 1114, 675, 651, 678, 589, 654, - 653, 0, 0, 689, 1028, 690, 691, 492, 493, 494, - 495, 1098, 717, 376, 609, 525, 526, 0, 676, 0, - 0, 0, 0, 0, 0, 0, 0, 681, 682, 679, - 800, 0, 740, 741, 0, 0, 603, 604, 408, 0, - 622, 416, 375, 509, 410, 587, 440, 0, 615, 683, - 616, 528, 529, 744, 749, 745, 746, 748, 769, 499, - 430, 436, 545, 450, 472, 531, 586, 507, 536, 373, - 576, 547, 478, 668, 696, 1123, 1093, 1122, 1124, 1125, - 1121, 1126, 1127, 1107, 982, 0, 1035, 1036, 1119, 1118, - 1120, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 725, 724, 723, 722, 721, 720, 719, 718, - 0, 0, 665, 390, 788, 782, 789, 770, 773, 772, - 747, 989, 347, 645, 470, 524, 407, 712, 713, 0, - 768, 1083, 1046, 1047, 1048, 979, 1049, 1043, 1044, 980, - 1045, 1084, 1033, 1080, 1081, 1008, 1038, 1050, 1079, 1051, - 1082, 1009, 1085, 1128, 1129, 1057, 1041, 303, 1130, 1054, - 1086, 1078, 1077, 1052, 1034, 1087, 1088, 1016, 1011, 1055, - 1056, 1042, 1063, 1064, 1065, 1068, 981, 1069, 1070, 1071, - 1072, 1073, 1067, 1066, 1030, 1031, 1032, 1058, 1059, 1061, - 1062, 1037, 555, 1012, 1013, 1014, 1015, 0, 0, 593, - 594, 595, 618, 0, 596, 578, 644, 417, 348, 559, - 585, 785, 786, 0, 0, 0, 0, 0, 0, 0, - 695, 706, 742, 743, 0, 756, 757, 759, 761, 1074, - 763, 552, 553, 771, 0, 0, 441, 363, 364, 500, - 501, 538, 0, 442, 443, 444, 448, 445, 446, 447, - 1060, 766, 767, 764, 474, 537, 560, 546, 784, 487, - 0, 792, 634, 635, 793, 752, 751, 349, 0, 1039, - 1040, 709, 710, 0, 0, 1109, 486, 641, 0, 974, - 341, 342, 343, 1099, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1026, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 977, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 1017, 687, 636, 548, 488, - 0, 704, 0, 0, 1100, 1110, 0, 0, 0, 0, - 0, 0, 0, 0, 1095, 0, 0, 0, 0, 0, - 1634, 0, 0, 1006, 1076, 1075, 993, 1003, 0, 0, - 371, 270, 631, 758, 633, 632, 994, 0, 995, 999, - 1002, 998, 996, 997, 0, 1090, 0, 0, 0, 0, - 0, 0, 960, 972, 0, 978, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 969, 970, 0, 0, 0, 0, 1027, 0, 971, - 0, 973, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 1022, 1000, 1004, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 1001, 0, 1025, 1029, 393, - 1116, 1023, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 1117, - 453, 454, 455, 456, 457, 458, 418, 1105, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 1020, 0, 755, - 0, 584, 0, 0, 1097, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 1024, 0, 535, 508, 1113, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 1094, 504, 716, - 753, 754, 638, 0, 1112, 1089, 1091, 1092, 1096, 1101, - 1102, 1103, 1104, 1106, 1108, 1111, 1115, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 1114, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 1028, 690, 691, 492, - 493, 494, 495, 1098, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 1123, 1093, 1122, - 1124, 1125, 1121, 1126, 1127, 1107, 982, 0, 1035, 1036, - 1119, 1118, 1120, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 989, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 1083, 1046, 1047, 1048, 979, 1049, 1043, - 1044, 980, 1045, 1084, 1033, 1080, 1081, 1008, 1038, 1050, - 1079, 1051, 1082, 1009, 1085, 1128, 1129, 1057, 1041, 303, - 1130, 1054, 1086, 1078, 1077, 1052, 1034, 1087, 1088, 1016, - 1011, 1055, 1056, 1042, 1063, 1064, 1065, 1068, 981, 1069, - 1070, 1071, 1072, 1073, 1067, 1066, 1030, 1031, 1032, 1058, - 1059, 1061, 1062, 1037, 555, 1012, 1013, 1014, 1015, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 1074, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 1060, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 1039, 1040, 709, 710, 0, 0, 1109, 486, 641, - 0, 974, 341, 342, 343, 1099, 345, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1026, 0, - 0, 0, 0, 0, 0, 0, 0, 506, 0, 0, - 650, 684, 673, 762, 637, 0, 0, 0, 0, 0, - 0, 977, 0, 0, 0, 400, 0, 0, 469, 688, - 669, 680, 670, 512, 655, 656, 657, 664, 412, 658, - 794, 660, 629, 661, 630, 662, 663, 1017, 687, 636, - 548, 488, 0, 704, 0, 0, 1100, 1110, 0, 0, - 0, 0, 0, 0, 0, 0, 1095, 0, 0, 0, - 0, 0, 968, 0, 0, 1006, 1076, 1075, 993, 1003, - 0, 0, 371, 270, 631, 758, 633, 632, 994, 0, - 995, 999, 1002, 998, 996, 997, 0, 1090, 0, 0, - 0, 0, 0, 0, 0, 972, 0, 978, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 969, 970, 0, 0, 0, 0, 1027, - 0, 971, 0, 973, 0, 0, 0, 0, 549, 577, - 0, 590, 0, 438, 439, 1022, 1000, 1004, 0, 0, - 0, 0, 356, 556, 574, 372, 543, 588, 377, 551, - 567, 367, 505, 539, 0, 0, 358, 572, 550, 483, - 357, 0, 532, 397, 414, 394, 503, 1001, 0, 1025, - 1029, 393, 1116, 1023, 582, 360, 0, 581, 502, 475, - 568, 573, 484, 477, 0, 359, 570, 482, 476, 452, - 404, 1117, 453, 454, 455, 456, 457, 458, 418, 1105, - 473, 519, 419, 490, 489, 491, 420, 421, 422, 423, - 424, 425, 426, 427, 428, 429, 0, 0, 0, 0, - 0, 612, 613, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 750, 1020, - 0, 755, 0, 584, 0, 0, 1097, 0, 0, 0, - 554, 0, 0, 459, 0, 0, 0, 1024, 0, 535, - 508, 1113, 0, 0, 533, 471, 569, 520, 575, 557, - 583, 527, 521, 350, 558, 396, 485, 368, 370, 783, - 398, 401, 405, 406, 496, 497, 514, 542, 561, 562, - 563, 395, 382, 534, 383, 415, 384, 351, 387, 386, - 388, 544, 389, 353, 515, 566, 0, 411, 530, 480, - 354, 479, 516, 565, 564, 369, 592, 599, 600, 692, - 0, 605, 797, 798, 799, 614, 0, 522, 365, 362, - 0, 0, 0, 391, 517, 378, 380, 381, 379, 511, - 513, 619, 620, 621, 623, 624, 625, 626, 0, 0, - 0, 0, 627, 693, 711, 677, 646, 607, 701, 643, - 647, 648, 432, 433, 434, 435, 714, 0, 0, 0, - 598, 460, 461, 0, 403, 402, 481, 355, 0, 0, - 449, 431, 523, 361, 399, 451, 437, 462, 463, 464, - 465, 466, 0, 467, 468, 409, 340, 346, 791, 1094, - 504, 716, 753, 754, 638, 0, 1112, 1089, 1091, 1092, - 1096, 1101, 1102, 1103, 1104, 1106, 1108, 1111, 1115, 790, - 0, 694, 708, 795, 707, 787, 510, 0, 541, 705, - 652, 0, 698, 671, 672, 0, 699, 667, 703, 0, - 640, 0, 608, 611, 642, 729, 730, 731, 352, 610, - 733, 734, 735, 736, 737, 738, 739, 732, 1114, 675, - 651, 678, 589, 654, 653, 0, 0, 689, 1028, 690, - 691, 492, 493, 494, 495, 1098, 717, 376, 609, 525, - 526, 0, 676, 0, 0, 0, 0, 0, 0, 0, - 0, 681, 682, 679, 800, 0, 740, 741, 0, 0, - 603, 604, 408, 0, 622, 416, 375, 509, 410, 587, - 440, 0, 615, 683, 616, 528, 529, 744, 749, 745, - 746, 748, 769, 499, 430, 436, 545, 450, 472, 531, - 586, 507, 536, 373, 576, 547, 478, 668, 696, 1123, - 1093, 1122, 1124, 1125, 1121, 1126, 1127, 1107, 982, 0, - 1035, 1036, 1119, 1118, 1120, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 725, 724, 723, 722, - 721, 720, 719, 718, 0, 0, 665, 390, 788, 782, - 789, 770, 773, 772, 747, 989, 347, 645, 470, 524, - 407, 712, 713, 0, 768, 1083, 1046, 1047, 1048, 979, - 1049, 1043, 1044, 980, 1045, 1084, 1033, 1080, 1081, 1008, - 1038, 1050, 1079, 1051, 1082, 1009, 1085, 1128, 1129, 1057, - 1041, 303, 1130, 1054, 1086, 1078, 1077, 1052, 1034, 1087, - 1088, 1016, 1011, 1055, 1056, 1042, 1063, 1064, 1065, 1068, - 981, 1069, 1070, 1071, 1072, 1073, 1067, 1066, 1030, 1031, - 1032, 1058, 1059, 1061, 1062, 1037, 555, 1012, 1013, 1014, - 1015, 0, 0, 593, 594, 595, 618, 0, 596, 578, - 644, 417, 348, 559, 585, 785, 786, 0, 0, 0, - 0, 0, 0, 0, 695, 706, 742, 743, 0, 756, - 757, 759, 761, 1074, 763, 552, 553, 771, 0, 0, - 441, 363, 364, 500, 501, 538, 0, 442, 443, 444, - 448, 445, 446, 447, 1060, 766, 767, 764, 474, 537, - 560, 546, 784, 487, 0, 792, 634, 635, 793, 752, - 751, 349, 0, 1039, 1040, 709, 710, 0, 0, 1109, - 486, 641, 0, 974, 341, 342, 343, 344, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 201, 246, - 200, 233, 202, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 234, 0, - 0, 0, 0, 0, 0, 226, 0, 400, 0, 235, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 659, 660, 629, 661, 630, 662, 663, 170, - 687, 636, 548, 488, 0, 704, 0, 0, 0, 0, - 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 239, 0, 0, 269, 0, 0, - 0, 0, 0, 0, 371, 270, 631, 758, 633, 632, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 261, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 0, 0, 0, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 0, - 0, 571, 601, 393, 591, 0, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 617, 453, 454, 455, 456, 457, 458, - 418, 518, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 199, 231, 243, 232, 84, 151, 0, 0, - 750, 0, 247, 755, 0, 584, 0, 0, 262, 0, - 0, 0, 554, 0, 0, 459, 153, 225, 224, 602, - 0, 535, 508, 275, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 284, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 152, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 726, 727, 728, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 0, 467, 468, 409, 340, 346, - 579, 392, 504, 716, 753, 754, 638, 0, 702, 639, - 649, 385, 674, 686, 685, 498, 597, 265, 697, 700, - 628, 276, 0, 694, 708, 666, 707, 277, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 580, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 606, 690, 691, 492, 493, 494, 495, 413, 717, 376, - 609, 525, 526, 167, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 274, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 0, 0, 0, 0, 0, 0, 0, 0, 79, - 0, 0, 326, 327, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 282, 366, 283, 770, 773, 772, 747, 0, 347, 645, - 470, 524, 407, 712, 713, 72, 768, 285, 286, 287, - 288, 289, 290, 291, 292, 333, 293, 294, 295, 296, - 297, 298, 299, 304, 305, 306, 307, 308, 309, 310, - 311, 715, 302, 303, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 0, 0, - 0, 0, 334, 774, 775, 776, 777, 778, 0, 0, - 335, 336, 337, 0, 0, 300, 301, 328, 555, 329, - 330, 331, 332, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 278, 279, 55, - 263, 266, 268, 267, 0, 73, 695, 706, 742, 743, - 9, 756, 757, 759, 761, 760, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 765, 766, 767, 764, - 474, 537, 560, 546, 273, 487, 174, 280, 634, 635, - 281, 752, 751, 349, 0, 338, 339, 709, 710, 0, - 0, 540, 486, 641, 341, 342, 343, 344, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 201, 246, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 1275, - 687, 636, 548, 488, 0, 704, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 239, 0, 0, 269, 0, 0, - 0, 0, 0, 0, 371, 270, 631, 758, 633, 632, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, - 3081, 3084, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 0, 0, 0, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 0, - 0, 571, 601, 393, 591, 0, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 617, 453, 454, 455, 456, 457, 458, - 418, 518, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 750, 0, 247, 755, 3085, 584, 0, 0, 0, 3080, - 0, 3079, 554, 3076, 3082, 459, 0, 0, 0, 602, - 0, 535, 508, 796, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 3083, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 3077, 467, 468, 409, 340, 346, - 791, 392, 504, 716, 753, 754, 638, 0, 702, 639, - 649, 385, 674, 686, 685, 498, 597, 0, 697, 700, - 628, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 580, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 606, 690, 691, 492, 493, 494, 495, 413, 717, 376, - 609, 525, 526, 0, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 326, 327, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 0, 347, 645, - 470, 524, 407, 712, 713, 0, 768, 285, 286, 287, - 288, 289, 290, 291, 292, 333, 293, 294, 295, 296, - 297, 298, 299, 304, 305, 306, 307, 308, 309, 310, - 311, 715, 302, 303, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 0, 0, - 0, 0, 334, 774, 775, 776, 777, 778, 0, 0, - 335, 336, 337, 0, 0, 300, 301, 328, 555, 329, - 330, 331, 332, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 760, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 765, 766, 767, 764, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 349, 0, 338, 339, 709, 710, 0, - 0, 540, 486, 641, 341, 342, 343, 344, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 201, 246, - 200, 233, 202, 0, 0, 0, 0, 0, 0, 506, - 822, 0, 650, 684, 673, 762, 637, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 0, - 687, 636, 548, 488, 0, 704, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 829, 0, 0, 0, 0, - 0, 0, 0, 0, 828, 0, 0, 269, 0, 0, - 0, 0, 0, 0, 371, 270, 631, 758, 633, 632, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 0, 0, 0, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 0, - 0, 571, 601, 393, 591, 0, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 617, 453, 454, 455, 456, 457, 458, - 418, 518, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 824, 825, 0, - 750, 0, 247, 755, 0, 584, 0, 0, 0, 0, - 0, 0, 554, 0, 0, 459, 0, 0, 0, 602, - 0, 535, 508, 796, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 0, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 0, 467, 468, 409, 340, 346, - 791, 392, 504, 716, 753, 754, 638, 0, 702, 639, - 649, 385, 674, 686, 685, 498, 597, 0, 697, 700, - 628, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 580, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 606, 690, 691, 492, 493, 494, 495, 823, 827, 376, - 609, 525, 526, 838, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 0, 0, 0, 0, 0, 0, 0, 0, 79, - 0, 0, 326, 327, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 0, 347, 645, - 470, 524, 407, 712, 713, 0, 768, 285, 286, 287, - 288, 289, 290, 291, 292, 333, 293, 294, 295, 296, - 297, 298, 299, 304, 305, 306, 307, 308, 309, 310, - 311, 715, 302, 303, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 0, 0, - 0, 0, 334, 774, 775, 776, 777, 778, 0, 0, - 335, 336, 337, 0, 0, 300, 301, 328, 555, 329, - 330, 331, 332, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 760, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 765, 766, 767, 764, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 349, 0, 338, 339, 709, 710, 0, - 0, 540, 486, 641, 341, 342, 343, 344, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 0, - 687, 636, 548, 488, 0, 704, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1655, 0, 0, 269, 0, 0, - 993, 1003, 0, 0, 371, 270, 631, 758, 633, 632, - 994, 0, 995, 999, 1002, 998, 996, 997, 0, 374, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 0, 1000, 0, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 1001, - 0, 571, 601, 393, 591, 0, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 617, 453, 454, 455, 456, 457, 458, - 418, 518, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 750, 0, 0, 755, 0, 584, 0, 0, 0, 0, - 0, 0, 554, 0, 0, 459, 0, 0, 0, 602, - 0, 535, 508, 796, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 0, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 0, 467, 468, 409, 340, 346, - 791, 392, 504, 716, 753, 754, 638, 0, 702, 639, - 649, 385, 674, 686, 685, 498, 597, 0, 697, 700, - 628, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 580, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 606, 690, 691, 492, 493, 494, 495, 413, 717, 376, - 609, 525, 526, 0, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 326, 327, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 0, 347, 645, - 470, 524, 407, 712, 713, 0, 768, 285, 286, 287, - 288, 289, 290, 291, 292, 333, 293, 294, 295, 296, - 297, 298, 299, 304, 305, 306, 307, 308, 309, 310, - 311, 715, 302, 303, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 0, 0, - 0, 0, 334, 774, 775, 776, 777, 778, 0, 0, - 335, 336, 337, 0, 0, 300, 301, 328, 555, 329, - 330, 331, 332, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 760, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 765, 766, 767, 764, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 349, 0, 338, 339, 709, 710, 0, - 0, 540, 486, 641, 341, 342, 343, 344, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 0, - 687, 636, 548, 488, 0, 704, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, - 0, 0, 0, 0, 371, 270, 631, 758, 633, 632, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, - 3081, 3084, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 438, 439, 0, 0, 0, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 358, 572, - 550, 483, 357, 0, 532, 397, 414, 394, 503, 0, - 0, 571, 601, 393, 591, 0, 582, 360, 0, 581, - 502, 475, 568, 573, 484, 477, 0, 359, 570, 482, - 476, 452, 404, 617, 453, 454, 455, 456, 457, 458, - 418, 518, 473, 519, 419, 490, 489, 491, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 0, 0, - 0, 0, 0, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 750, 0, 0, 755, 3085, 584, 0, 0, 0, 3080, - 0, 3079, 554, 3076, 3082, 459, 0, 0, 0, 602, - 0, 535, 508, 796, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 3083, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 3077, 467, 468, 409, 340, 346, - 791, 392, 504, 716, 753, 754, 638, 0, 702, 639, - 649, 385, 674, 686, 685, 498, 597, 0, 697, 700, - 628, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 580, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 606, 690, 691, 492, 493, 494, 495, 413, 717, 376, - 609, 525, 526, 0, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 326, 327, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 0, 347, 645, - 470, 524, 407, 712, 713, 0, 768, 285, 286, 287, - 288, 289, 290, 291, 292, 333, 293, 294, 295, 296, - 297, 298, 299, 304, 305, 306, 307, 308, 309, 310, - 311, 715, 302, 303, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 0, 0, - 0, 0, 334, 774, 775, 776, 777, 778, 0, 0, - 335, 336, 337, 0, 0, 300, 301, 328, 555, 329, - 330, 331, 332, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 760, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 765, 766, 767, 764, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 349, 0, 338, 339, 709, 710, 0, - 0, 540, 486, 641, 341, 342, 343, 344, 345, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, - 0, 0, 650, 684, 673, 762, 637, 0, 1354, 0, - 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, - 469, 688, 669, 680, 670, 512, 655, 656, 657, 664, - 412, 658, 794, 660, 629, 661, 630, 662, 663, 0, - 687, 636, 548, 488, 0, 704, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, - 0, 0, 0, 0, 371, 270, 631, 758, 633, 632, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 549, 577, 0, 590, 0, 3528, 3529, 1334, 0, 0, - 0, 0, 0, 0, 356, 556, 574, 372, 543, 588, - 377, 551, 567, 367, 505, 539, 0, 0, 3522, 3525, - 3526, 3527, 3530, 0, 3535, 3531, 3532, 3533, 3534, 0, - 0, 3518, 3519, 3520, 3521, 1332, 3497, 3523, 0, 3498, - 502, 3499, 3500, 3501, 3502, 3503, 1337, 3504, 3505, 3506, - 3507, 3508, 3515, 3516, 3509, 3510, 3511, 3512, 3513, 3514, - 3536, 3537, 3538, 3539, 3540, 3541, 3542, 3543, 3545, 3544, - 3546, 3547, 3548, 3549, 3550, 3551, 3552, 3553, 1365, 1367, - 1369, 1371, 1374, 612, 613, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 750, 0, 0, 755, 0, 584, 0, 0, 0, 0, - 0, 0, 554, 0, 0, 459, 0, 0, 0, 3517, - 0, 535, 508, 796, 0, 0, 533, 471, 569, 520, - 575, 557, 583, 527, 521, 350, 558, 396, 485, 368, - 370, 783, 398, 401, 405, 406, 496, 497, 514, 542, - 561, 562, 563, 395, 382, 534, 383, 415, 384, 351, - 387, 386, 388, 544, 389, 353, 515, 566, 0, 411, - 530, 480, 354, 479, 516, 565, 564, 369, 592, 599, - 600, 692, 0, 605, 797, 798, 799, 614, 0, 522, - 365, 362, 0, 0, 0, 391, 517, 378, 380, 381, - 379, 511, 513, 619, 620, 621, 623, 624, 625, 626, - 0, 0, 0, 0, 627, 693, 711, 677, 646, 607, - 701, 643, 647, 648, 432, 433, 434, 435, 714, 0, - 0, 0, 598, 460, 461, 0, 403, 402, 481, 355, - 0, 0, 449, 431, 523, 361, 399, 451, 437, 462, - 463, 464, 465, 466, 0, 467, 468, 409, 340, 346, - 791, 392, 504, 716, 753, 754, 638, 0, 702, 639, - 649, 385, 674, 686, 685, 498, 597, 0, 697, 700, - 628, 790, 0, 694, 708, 795, 707, 787, 510, 0, - 541, 705, 652, 0, 698, 671, 672, 0, 699, 667, - 703, 0, 640, 0, 608, 611, 642, 729, 730, 731, - 352, 610, 733, 734, 735, 736, 737, 738, 739, 732, - 580, 675, 651, 678, 589, 654, 653, 0, 0, 689, - 606, 690, 691, 492, 493, 494, 495, 413, 717, 376, - 609, 525, 526, 0, 676, 0, 0, 0, 0, 0, - 0, 0, 0, 681, 682, 679, 800, 0, 740, 741, - 0, 0, 603, 604, 408, 0, 622, 416, 375, 509, - 410, 587, 440, 0, 615, 683, 616, 528, 529, 744, - 749, 745, 746, 748, 769, 499, 430, 436, 545, 450, - 472, 531, 586, 507, 536, 373, 576, 547, 478, 668, - 696, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 326, 327, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 725, 724, - 723, 722, 721, 720, 719, 718, 0, 0, 665, 390, - 788, 782, 789, 770, 773, 772, 747, 0, 347, 3524, - 470, 524, 407, 712, 713, 0, 768, 285, 286, 287, - 288, 289, 290, 291, 292, 333, 293, 294, 295, 296, - 297, 298, 299, 304, 305, 306, 307, 308, 309, 310, - 311, 715, 302, 303, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 0, 0, - 0, 0, 334, 774, 775, 776, 777, 778, 0, 0, - 335, 336, 337, 0, 0, 300, 301, 328, 555, 329, - 330, 331, 332, 0, 0, 593, 594, 595, 618, 0, - 596, 578, 644, 417, 348, 559, 585, 785, 786, 0, - 0, 0, 0, 0, 0, 0, 695, 706, 742, 743, - 0, 756, 757, 759, 761, 760, 763, 552, 553, 771, - 0, 0, 441, 363, 364, 500, 501, 538, 0, 442, - 443, 444, 448, 445, 446, 447, 765, 766, 767, 764, - 474, 537, 560, 546, 784, 487, 0, 792, 634, 635, - 793, 752, 751, 3496, 0, 338, 339, 709, 710, 0, - 0, 540, 486, 641, 1826, 341, 342, 343, 344, 345, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 201, - 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 506, 0, 0, 650, 684, 673, 762, 637, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, - 0, 469, 688, 669, 680, 670, 512, 655, 656, 657, - 664, 412, 658, 794, 660, 629, 661, 630, 662, 663, - 1275, 687, 636, 548, 488, 0, 704, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1823, 0, 0, 269, 0, - 0, 0, 0, 0, 0, 371, 270, 631, 758, 633, - 632, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 374, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 549, 577, 0, 590, 0, 438, 439, 0, 0, - 0, 0, 0, 0, 0, 356, 556, 574, 372, 543, - 588, 377, 551, 567, 367, 505, 539, 0, 0, 358, - 572, 550, 483, 357, 0, 532, 397, 414, 394, 503, - 0, 0, 571, 601, 393, 591, 0, 582, 360, 0, - 581, 502, 475, 568, 573, 484, 477, 0, 359, 570, - 482, 476, 452, 404, 617, 453, 454, 455, 456, 457, - 458, 418, 518, 473, 519, 419, 490, 489, 491, 420, - 421, 422, 423, 424, 425, 426, 427, 428, 429, 0, - 0, 0, 0, 0, 612, 613, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 750, 0, 247, 755, 0, 584, 0, 0, 0, - 0, 0, 0, 554, 0, 0, 459, 0, 0, 0, - 602, 0, 535, 508, 796, 0, 0, 533, 471, 569, - 520, 575, 557, 583, 527, 521, 350, 558, 396, 485, - 368, 370, 783, 398, 401, 405, 406, 496, 497, 514, - 542, 561, 562, 563, 395, 382, 534, 383, 415, 384, - 351, 387, 386, 388, 544, 389, 353, 515, 566, 0, - 411, 530, 480, 354, 479, 516, 565, 564, 369, 592, - 599, 600, 692, 0, 605, 797, 798, 799, 614, 0, - 522, 365, 362, 0, 0, 0, 391, 517, 378, 380, - 381, 379, 511, 513, 619, 620, 621, 623, 624, 625, - 626, 0, 0, 0, 0, 627, 693, 711, 677, 646, - 607, 701, 643, 647, 648, 432, 433, 434, 435, 714, - 0, 0, 0, 598, 460, 461, 0, 403, 402, 481, - 355, 0, 0, 449, 431, 523, 361, 399, 451, 437, - 462, 463, 464, 465, 466, 0, 467, 468, 409, 340, - 346, 791, 392, 504, 716, 753, 754, 638, 0, 702, - 639, 649, 385, 674, 686, 685, 498, 597, 0, 697, - 700, 628, 790, 0, 694, 708, 795, 707, 787, 510, - 0, 541, 705, 652, 0, 698, 671, 672, 0, 699, - 667, 703, 0, 640, 0, 608, 611, 642, 729, 730, - 731, 352, 610, 733, 734, 735, 736, 737, 738, 739, - 732, 580, 675, 651, 678, 589, 654, 653, 0, 0, - 689, 606, 690, 691, 492, 493, 494, 495, 413, 717, - 376, 609, 525, 526, 0, 676, 0, 0, 0, 0, - 0, 0, 0, 0, 681, 682, 679, 800, 0, 740, - 741, 0, 0, 603, 604, 408, 0, 622, 416, 375, - 509, 410, 587, 440, 0, 615, 683, 616, 528, 529, - 744, 749, 745, 746, 748, 769, 499, 430, 436, 545, - 450, 472, 531, 586, 507, 536, 373, 576, 547, 478, - 668, 696, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 326, 327, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 725, - 724, 723, 722, 721, 720, 719, 718, 0, 0, 665, - 390, 788, 782, 789, 770, 773, 772, 747, 0, 347, - 645, 470, 524, 407, 712, 713, 0, 768, 285, 286, - 287, 288, 289, 290, 291, 292, 333, 293, 294, 295, - 296, 297, 298, 299, 304, 305, 306, 307, 308, 309, - 310, 311, 715, 302, 303, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 325, 0, - 0, 0, 0, 334, 774, 775, 776, 777, 778, 0, - 0, 335, 336, 337, 0, 0, 300, 301, 328, 555, - 329, 330, 331, 332, 0, 0, 593, 594, 595, 618, - 0, 596, 578, 644, 417, 348, 559, 585, 785, 786, - 0, 0, 0, 0, 0, 0, 0, 695, 706, 742, - 743, 0, 756, 757, 759, 761, 760, 763, 552, 553, - 771, 0, 0, 441, 363, 364, 500, 501, 538, 0, - 442, 443, 444, 448, 445, 446, 447, 765, 766, 767, - 764, 474, 537, 560, 546, 784, 487, 0, 792, 634, - 635, 793, 752, 751, 349, 0, 338, 339, 709, 710, - 0, 0, 540, 486, 641, 0, 2476, 341, 342, 343, - 344, 345, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 506, 0, 0, 650, 684, 673, 762, 637, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 400, 0, 0, 469, 688, 669, 680, 670, 512, 655, - 656, 657, 664, 412, 658, 794, 660, 629, 661, 630, - 662, 663, 0, 687, 636, 548, 488, 0, 704, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 269, 0, 0, 0, 0, 0, 0, 371, 270, 631, - 758, 633, 632, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 374, 0, 3103, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 549, 577, 0, 590, 0, 438, 439, - 0, 0, 0, 0, 0, 0, 0, 356, 556, 574, - 372, 543, 588, 377, 551, 567, 367, 505, 539, 0, - 0, 358, 572, 550, 483, 357, 0, 532, 397, 414, - 394, 503, 0, 0, 571, 601, 393, 591, 0, 582, - 360, 0, 581, 502, 475, 568, 573, 484, 477, 0, - 359, 570, 482, 476, 452, 404, 617, 453, 454, 455, - 456, 457, 458, 418, 518, 473, 519, 419, 490, 489, - 491, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 0, 0, 0, 0, 0, 612, 613, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 750, 0, 0, 755, 3102, 584, 0, - 0, 0, 3109, 3105, 3107, 554, 0, 3106, 459, 0, - 0, 0, 602, 0, 535, 508, 796, 0, 3100, 533, - 471, 569, 520, 575, 557, 583, 527, 521, 350, 558, - 396, 485, 368, 370, 783, 398, 401, 405, 406, 496, - 497, 514, 542, 561, 562, 563, 395, 382, 534, 383, - 415, 384, 351, 387, 386, 388, 544, 389, 353, 515, - 566, 3108, 411, 530, 480, 354, 479, 516, 565, 564, - 369, 592, 599, 600, 692, 0, 605, 797, 798, 799, - 614, 0, 522, 365, 362, 0, 0, 0, 391, 517, - 378, 380, 381, 379, 511, 513, 619, 620, 621, 623, - 624, 625, 626, 0, 0, 0, 0, 627, 693, 711, - 677, 646, 607, 701, 643, 647, 648, 432, 433, 434, - 435, 714, 0, 0, 0, 598, 460, 461, 0, 403, - 402, 481, 355, 0, 0, 449, 431, 523, 361, 399, - 451, 437, 462, 463, 464, 465, 466, 0, 467, 468, - 409, 340, 346, 791, 392, 504, 716, 753, 754, 638, - 0, 702, 639, 649, 385, 674, 686, 685, 498, 597, - 0, 697, 700, 628, 790, 0, 694, 708, 795, 707, - 787, 510, 0, 541, 705, 652, 0, 698, 671, 672, - 0, 699, 667, 703, 0, 640, 0, 608, 611, 642, - 729, 730, 731, 352, 610, 733, 734, 735, 736, 737, - 738, 739, 732, 580, 675, 651, 678, 589, 654, 653, - 0, 0, 689, 606, 690, 691, 492, 493, 494, 495, - 413, 717, 376, 609, 525, 526, 0, 676, 0, 0, - 0, 0, 0, 0, 0, 0, 681, 682, 679, 800, - 0, 740, 741, 0, 0, 603, 604, 408, 0, 622, - 416, 375, 509, 410, 587, 440, 0, 615, 683, 616, - 528, 529, 744, 749, 745, 746, 748, 769, 499, 430, - 436, 545, 450, 472, 531, 586, 507, 536, 373, 576, - 547, 478, 668, 696, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 327, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 725, 724, 723, 722, 721, 720, 719, 718, 0, - 0, 665, 390, 788, 782, 789, 770, 773, 772, 747, - 0, 347, 645, 470, 524, 407, 712, 713, 0, 768, - 285, 286, 287, 288, 289, 290, 291, 292, 333, 293, - 294, 295, 296, 297, 298, 299, 304, 305, 306, 307, - 308, 309, 310, 311, 715, 302, 303, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 0, 0, 0, 0, 334, 774, 775, 776, 777, - 778, 0, 0, 335, 336, 337, 0, 0, 300, 301, - 328, 555, 329, 330, 331, 332, 0, 0, 593, 594, - 595, 618, 0, 596, 578, 644, 417, 348, 559, 585, - 785, 786, 0, 0, 0, 0, 0, 0, 0, 695, - 706, 742, 743, 0, 756, 757, 759, 761, 760, 763, - 552, 553, 771, 0, 0, 441, 363, 364, 500, 501, - 538, 0, 442, 443, 444, 448, 445, 446, 447, 765, - 766, 767, 764, 474, 537, 560, 546, 784, 487, 0, - 792, 634, 635, 793, 752, 751, 349, 0, 338, 339, - 709, 710, 0, 0, 540, 486, 641, 341, 342, 343, - 344, 345, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 506, 0, 0, 650, 684, 673, 762, 637, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 400, 0, 0, 469, 688, 669, 680, 670, 512, 655, - 656, 657, 664, 412, 658, 794, 660, 629, 661, 630, - 662, 663, 0, 687, 636, 548, 488, 0, 704, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 269, 0, 0, 0, 0, 0, 0, 371, 270, 631, - 758, 633, 632, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 374, 0, 3103, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 549, 577, 0, 590, 0, 438, 439, - 0, 0, 0, 0, 0, 0, 0, 356, 556, 574, - 372, 543, 588, 377, 551, 567, 367, 505, 539, 0, - 0, 358, 572, 550, 483, 357, 0, 532, 397, 414, - 394, 503, 0, 0, 571, 601, 393, 591, 0, 582, - 360, 0, 581, 502, 475, 568, 573, 484, 477, 0, - 359, 570, 482, 476, 452, 404, 617, 453, 454, 455, - 456, 457, 458, 418, 518, 473, 519, 419, 490, 489, - 491, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 0, 0, 0, 0, 0, 612, 613, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 750, 0, 0, 755, 3102, 584, 0, - 0, 0, 3109, 3105, 3107, 554, 0, 3106, 459, 0, - 0, 0, 602, 0, 535, 508, 796, 0, 0, 533, - 471, 569, 520, 575, 557, 583, 527, 521, 350, 558, - 396, 485, 368, 370, 783, 398, 401, 405, 406, 496, - 497, 514, 542, 561, 562, 563, 395, 382, 534, 383, - 415, 384, 351, 387, 386, 388, 544, 389, 353, 515, - 566, 3108, 411, 530, 480, 354, 479, 516, 565, 564, - 369, 592, 599, 600, 692, 0, 605, 797, 798, 799, - 614, 0, 522, 365, 362, 0, 0, 0, 391, 517, - 378, 380, 381, 379, 511, 513, 619, 620, 621, 623, - 624, 625, 626, 0, 0, 0, 0, 627, 693, 711, - 677, 646, 607, 701, 643, 647, 648, 432, 433, 434, - 435, 714, 0, 0, 0, 598, 460, 461, 0, 403, - 402, 481, 355, 0, 0, 449, 431, 523, 361, 399, - 451, 437, 462, 463, 464, 465, 466, 0, 467, 468, - 409, 340, 346, 791, 392, 504, 716, 753, 754, 638, - 0, 702, 639, 649, 385, 674, 686, 685, 498, 597, - 0, 697, 700, 628, 790, 0, 694, 708, 795, 707, - 787, 510, 0, 541, 705, 652, 0, 698, 671, 672, - 0, 699, 667, 703, 0, 640, 0, 608, 611, 642, - 729, 730, 731, 352, 610, 733, 734, 735, 736, 737, - 738, 739, 732, 580, 675, 651, 678, 589, 654, 653, - 0, 0, 689, 606, 690, 691, 492, 493, 494, 495, - 413, 717, 376, 609, 525, 526, 0, 676, 0, 0, - 0, 0, 0, 0, 0, 0, 681, 682, 679, 800, - 0, 740, 741, 0, 0, 603, 604, 408, 0, 622, - 416, 375, 509, 410, 587, 440, 0, 615, 683, 616, - 528, 529, 744, 749, 745, 746, 748, 769, 499, 430, - 436, 545, 450, 472, 531, 586, 507, 536, 373, 576, - 547, 478, 668, 696, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 327, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 725, 724, 723, 722, 721, 720, 719, 718, 0, - 0, 665, 390, 788, 782, 789, 770, 773, 772, 747, - 0, 347, 645, 470, 524, 407, 712, 713, 0, 768, - 285, 286, 287, 288, 289, 290, 291, 292, 333, 293, - 294, 295, 296, 297, 298, 299, 304, 305, 306, 307, - 308, 309, 310, 311, 715, 302, 303, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 0, 0, 0, 0, 334, 774, 775, 776, 777, - 778, 0, 0, 335, 336, 337, 0, 0, 300, 301, - 328, 555, 329, 330, 331, 332, 0, 0, 593, 594, - 595, 618, 0, 596, 578, 644, 417, 348, 559, 585, - 785, 786, 0, 0, 0, 0, 0, 0, 0, 695, - 706, 742, 743, 0, 756, 757, 759, 761, 760, 763, - 552, 553, 771, 0, 0, 441, 363, 364, 500, 501, - 538, 0, 442, 443, 444, 448, 445, 446, 447, 765, - 766, 767, 764, 474, 537, 560, 546, 784, 487, 0, - 792, 634, 635, 793, 752, 751, 349, 0, 338, 339, - 709, 710, 0, 0, 540, 486, 641, 341, 342, 343, - 344, 345, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 201, 246, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 506, 0, 0, 650, 684, 673, 762, 637, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 400, 0, 0, 469, 688, 669, 680, 670, 512, 655, - 656, 657, 664, 412, 658, 794, 660, 629, 661, 630, - 662, 663, 1275, 687, 636, 548, 488, 0, 704, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 239, 3264, 0, - 269, 0, 0, 0, 0, 0, 0, 371, 270, 631, - 758, 633, 632, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 374, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 549, 577, 0, 590, 0, 438, 439, - 0, 0, 0, 0, 0, 0, 0, 356, 556, 574, - 372, 543, 588, 377, 551, 567, 367, 505, 539, 0, - 0, 358, 572, 550, 483, 357, 0, 532, 397, 414, - 394, 503, 0, 0, 571, 601, 393, 591, 0, 582, - 360, 0, 581, 502, 475, 568, 573, 484, 477, 0, - 359, 570, 482, 476, 452, 404, 617, 453, 454, 455, - 456, 457, 458, 418, 518, 473, 519, 419, 490, 489, - 491, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 0, 0, 0, 0, 0, 612, 613, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 750, 0, 247, 755, 0, 584, 0, - 0, 0, 0, 0, 0, 554, 0, 0, 459, 0, - 0, 0, 602, 0, 535, 508, 796, 0, 0, 533, - 471, 569, 520, 575, 557, 583, 527, 521, 350, 558, - 396, 485, 368, 370, 783, 398, 401, 405, 406, 496, - 497, 514, 542, 561, 562, 563, 395, 382, 534, 383, - 415, 384, 351, 387, 386, 388, 544, 389, 353, 515, - 566, 0, 411, 530, 480, 354, 479, 516, 565, 564, - 369, 592, 599, 600, 692, 0, 605, 797, 798, 799, - 614, 0, 522, 365, 362, 0, 0, 0, 391, 517, - 378, 380, 381, 379, 511, 513, 619, 620, 621, 623, - 624, 625, 626, 0, 0, 0, 0, 627, 693, 711, - 677, 646, 607, 701, 643, 647, 648, 432, 433, 434, - 435, 714, 0, 0, 0, 598, 460, 461, 0, 403, - 402, 481, 355, 0, 0, 449, 431, 523, 361, 399, - 451, 437, 462, 463, 464, 465, 466, 0, 467, 468, - 409, 340, 346, 791, 392, 504, 716, 753, 754, 638, - 0, 702, 639, 649, 385, 674, 686, 685, 498, 597, - 0, 697, 700, 628, 790, 0, 694, 708, 795, 707, - 787, 510, 0, 541, 705, 652, 0, 698, 671, 672, - 0, 699, 667, 703, 0, 640, 0, 608, 611, 642, - 729, 730, 731, 352, 610, 733, 734, 735, 736, 737, - 738, 739, 732, 580, 675, 651, 678, 589, 654, 653, - 0, 0, 689, 606, 690, 691, 492, 493, 494, 495, - 413, 717, 376, 609, 525, 526, 0, 676, 0, 0, - 0, 0, 0, 0, 0, 0, 681, 682, 679, 800, - 0, 740, 741, 0, 0, 603, 604, 408, 0, 622, - 416, 375, 509, 410, 587, 440, 0, 615, 683, 616, - 528, 529, 744, 749, 745, 746, 748, 769, 499, 430, - 436, 545, 450, 472, 531, 586, 507, 536, 373, 576, - 547, 478, 668, 696, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 327, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 725, 724, 723, 722, 721, 720, 719, 718, 0, - 0, 665, 390, 788, 782, 789, 770, 773, 772, 747, - 0, 347, 645, 470, 524, 407, 712, 713, 0, 768, - 285, 286, 287, 288, 289, 290, 291, 292, 333, 293, - 294, 295, 296, 297, 298, 299, 304, 305, 306, 307, - 308, 309, 310, 311, 715, 302, 303, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 0, 0, 0, 0, 334, 774, 775, 776, 777, - 778, 0, 0, 335, 336, 337, 0, 0, 300, 301, - 328, 555, 329, 330, 331, 332, 0, 0, 593, 594, - 595, 618, 0, 596, 578, 644, 417, 348, 559, 585, - 785, 786, 0, 0, 0, 0, 0, 0, 0, 695, - 706, 742, 743, 0, 756, 757, 759, 761, 760, 763, - 552, 553, 771, 0, 0, 441, 363, 364, 500, 501, - 538, 0, 442, 443, 444, 448, 445, 446, 447, 765, - 766, 767, 764, 474, 537, 560, 546, 784, 487, 0, - 792, 634, 635, 793, 752, 751, 349, 0, 338, 339, - 709, 710, 0, 0, 540, 486, 641, 341, 342, 343, - 344, 345, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 201, 246, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 506, 0, 0, 650, 684, 673, 762, 637, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 400, 0, 0, 469, 688, 669, 680, 670, 512, 655, - 656, 657, 664, 412, 658, 794, 660, 629, 661, 630, - 662, 663, 1275, 687, 636, 548, 488, 0, 704, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 239, 3003, 0, - 269, 0, 0, 0, 0, 0, 0, 371, 270, 631, - 758, 633, 632, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 374, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 549, 577, 0, 590, 0, 438, 439, - 0, 0, 0, 0, 0, 0, 0, 356, 556, 574, - 372, 543, 588, 377, 551, 567, 367, 505, 539, 0, - 0, 358, 572, 550, 483, 357, 0, 532, 397, 414, - 394, 503, 0, 0, 571, 601, 393, 591, 0, 582, - 360, 0, 581, 502, 475, 568, 573, 484, 477, 0, - 359, 570, 482, 476, 452, 404, 617, 453, 454, 455, - 456, 457, 458, 418, 518, 473, 519, 419, 490, 489, - 491, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 0, 0, 0, 0, 0, 612, 613, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 750, 0, 247, 755, 0, 584, 0, - 0, 0, 0, 0, 0, 554, 0, 0, 459, 0, - 0, 0, 602, 0, 535, 508, 796, 0, 0, 533, - 471, 569, 520, 575, 557, 583, 527, 521, 350, 558, - 396, 485, 368, 370, 783, 398, 401, 405, 406, 496, - 497, 514, 542, 561, 562, 563, 395, 382, 534, 383, - 415, 384, 351, 387, 386, 388, 544, 389, 353, 515, - 566, 0, 411, 530, 480, 354, 479, 516, 565, 564, - 369, 592, 599, 600, 692, 0, 605, 797, 798, 799, - 614, 0, 522, 365, 362, 0, 0, 0, 391, 517, - 378, 380, 381, 379, 511, 513, 619, 620, 621, 623, - 624, 625, 626, 0, 0, 0, 0, 627, 693, 711, - 677, 646, 607, 701, 643, 647, 648, 432, 433, 434, - 435, 714, 0, 0, 0, 598, 460, 461, 0, 403, - 402, 481, 355, 0, 0, 449, 431, 523, 361, 399, - 451, 437, 462, 463, 464, 465, 466, 0, 467, 468, - 409, 340, 346, 791, 392, 504, 716, 753, 754, 638, - 0, 702, 639, 649, 385, 674, 686, 685, 498, 597, - 0, 697, 700, 628, 790, 0, 694, 708, 795, 707, - 787, 510, 0, 541, 705, 652, 0, 698, 671, 672, - 0, 699, 667, 703, 0, 640, 0, 608, 611, 642, - 729, 730, 731, 352, 610, 733, 734, 735, 736, 737, - 738, 739, 732, 580, 675, 651, 678, 589, 654, 653, - 0, 0, 689, 606, 690, 691, 492, 493, 494, 495, - 413, 717, 376, 609, 525, 526, 0, 676, 0, 0, - 0, 0, 0, 0, 0, 0, 681, 682, 679, 800, - 0, 740, 741, 0, 0, 603, 604, 408, 0, 622, - 416, 375, 509, 410, 587, 440, 0, 615, 683, 616, - 528, 529, 744, 749, 745, 746, 748, 769, 499, 430, - 436, 545, 450, 472, 531, 586, 507, 536, 373, 576, - 547, 478, 668, 696, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 326, 327, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 725, 724, 723, 722, 721, 720, 719, 718, 0, - 0, 665, 390, 788, 782, 789, 770, 773, 772, 747, - 0, 347, 645, 470, 524, 407, 712, 713, 0, 768, - 285, 286, 287, 288, 289, 290, 291, 292, 333, 293, - 294, 295, 296, 297, 298, 299, 304, 305, 306, 307, - 308, 309, 310, 311, 715, 302, 303, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 0, 0, 0, 0, 334, 774, 775, 776, 777, - 778, 0, 0, 335, 336, 337, 0, 0, 300, 301, - 328, 555, 329, 330, 331, 332, 0, 0, 593, 594, - 595, 618, 0, 596, 578, 644, 417, 348, 559, 585, - 785, 786, 0, 0, 0, 0, 0, 0, 0, 695, - 706, 742, 743, 0, 756, 757, 759, 761, 760, 763, - 552, 553, 771, 0, 0, 441, 363, 364, 500, 501, - 538, 0, 442, 443, 444, 448, 445, 446, 447, 765, - 766, 767, 764, 474, 537, 560, 546, 784, 487, 0, - 792, 634, 635, 793, 752, 751, 349, 0, 338, 339, - 709, 710, 0, 0, 540, 486, 641, 1826, 341, 342, - 343, 344, 345, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 506, 0, 0, 650, 684, 673, 762, - 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 400, 0, 0, 469, 688, 669, 680, 670, 512, - 655, 656, 657, 664, 412, 658, 794, 660, 629, 661, - 630, 662, 663, 0, 687, 636, 548, 488, 0, 704, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1823, 0, - 0, 269, 0, 0, 0, 0, 0, 0, 371, 270, - 631, 758, 633, 632, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 374, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 549, 577, 0, 590, 0, 438, - 439, 0, 0, 0, 0, 0, 0, 0, 356, 556, - 574, 372, 543, 588, 377, 551, 567, 367, 505, 539, - 0, 0, 358, 572, 550, 483, 357, 0, 532, 397, - 414, 394, 503, 0, 0, 571, 601, 393, 591, 0, - 582, 360, 0, 581, 502, 475, 568, 573, 484, 477, - 0, 359, 570, 482, 476, 452, 404, 617, 453, 454, - 455, 456, 457, 458, 418, 518, 473, 519, 419, 490, - 489, 491, 420, 421, 422, 423, 424, 425, 426, 427, - 428, 429, 0, 0, 0, 0, 0, 612, 613, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 750, 0, 0, 755, 0, 584, - 0, 0, 0, 0, 0, 0, 554, 0, 0, 459, - 0, 0, 0, 602, 0, 535, 508, 796, 0, 0, - 533, 471, 569, 520, 575, 557, 583, 527, 521, 350, - 558, 396, 485, 368, 370, 783, 398, 401, 405, 406, - 496, 497, 514, 542, 561, 562, 563, 395, 382, 534, - 383, 415, 384, 351, 387, 386, 388, 544, 389, 353, - 515, 566, 0, 411, 530, 480, 354, 479, 516, 565, - 564, 369, 592, 599, 600, 692, 0, 605, 797, 798, - 799, 614, 0, 522, 365, 362, 0, 0, 0, 391, - 517, 378, 380, 381, 379, 511, 513, 619, 620, 621, - 623, 624, 625, 626, 0, 0, 0, 0, 627, 693, - 711, 677, 646, 607, 701, 643, 647, 648, 432, 433, - 434, 435, 714, 0, 0, 0, 598, 460, 461, 0, - 403, 402, 481, 355, 0, 0, 449, 431, 523, 361, - 399, 451, 437, 462, 463, 464, 465, 466, 0, 467, - 468, 409, 340, 346, 791, 392, 504, 716, 753, 754, - 638, 0, 702, 639, 649, 385, 674, 686, 685, 498, - 597, 0, 697, 700, 628, 790, 0, 694, 708, 795, - 707, 787, 510, 0, 541, 705, 652, 0, 698, 671, - 672, 0, 699, 667, 703, 0, 640, 0, 608, 611, - 642, 729, 730, 731, 352, 610, 733, 734, 735, 736, - 737, 738, 739, 732, 580, 675, 651, 678, 589, 654, - 653, 0, 0, 689, 606, 690, 691, 492, 493, 494, - 495, 413, 717, 376, 609, 525, 526, 0, 676, 0, - 0, 0, 0, 0, 0, 0, 0, 681, 682, 679, - 800, 0, 740, 741, 0, 0, 603, 604, 408, 0, - 622, 416, 375, 509, 410, 587, 440, 0, 615, 683, - 616, 528, 529, 744, 749, 745, 746, 748, 769, 499, - 430, 436, 545, 450, 472, 531, 586, 507, 536, 373, - 576, 547, 478, 668, 696, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 326, 327, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 725, 724, 723, 722, 721, 720, 719, 718, - 0, 0, 665, 390, 788, 782, 789, 770, 773, 772, - 747, 0, 347, 645, 470, 524, 407, 712, 713, 0, - 768, 285, 286, 287, 288, 289, 290, 291, 292, 333, - 293, 294, 295, 296, 297, 298, 299, 304, 305, 306, - 307, 308, 309, 310, 311, 715, 302, 303, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, - 324, 325, 0, 0, 0, 0, 334, 774, 775, 776, - 777, 778, 0, 0, 335, 336, 337, 0, 0, 300, - 301, 328, 555, 329, 330, 331, 332, 0, 0, 593, - 594, 595, 618, 0, 596, 578, 644, 417, 348, 559, - 585, 785, 786, 0, 0, 0, 0, 0, 0, 0, - 695, 706, 742, 743, 0, 756, 757, 759, 761, 760, - 763, 552, 553, 771, 0, 0, 441, 363, 364, 500, - 501, 538, 0, 442, 443, 444, 448, 445, 446, 447, - 765, 766, 767, 764, 474, 537, 560, 546, 784, 487, - 0, 792, 634, 635, 793, 752, 751, 349, 0, 338, - 339, 709, 710, 0, 0, 540, 486, 641, 0, 2476, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 1248, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 1255, 1256, 0, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1259, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 1242, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 904, 582, 360, 903, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 1246, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 1247, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 1250, 690, 691, 492, - 493, 494, 495, 413, 717, 1245, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 1257, 1243, 1253, 1244, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 1254, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 1241, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 1255, 1256, 0, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1259, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 904, 582, 360, 903, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 1257, 2590, 1253, 2591, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 1254, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 3818, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3821, 0, 0, 0, 0, 3820, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 2650, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 2651, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 1576, 0, - 1577, 1575, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 0, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 1885, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 1883, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 1881, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 1879, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 1883, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 1881, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 1844, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1845, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 1843, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 1209, 0, 0, 0, 0, - 0, 0, 1214, 400, 0, 0, 469, 688, 1210, 680, - 670, 1212, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 1213, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5335, 0, 269, 1076, 0, 0, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 1883, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 1881, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 1883, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 2205, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 0, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 4718, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4719, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 2650, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 2651, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 4299, 4300, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 269, 0, 0, 4057, 4059, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3678, 0, 0, 269, 0, 0, 3682, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 341, 342, 343, 344, 345, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 506, 0, 0, 650, 684, - 673, 762, 637, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 400, 0, 0, 469, 688, 669, 680, - 670, 512, 655, 656, 657, 664, 412, 658, 794, 660, - 629, 661, 630, 662, 663, 0, 687, 636, 548, 488, - 0, 704, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3672, 0, 0, 269, 0, 0, 3676, 0, 0, 0, - 371, 270, 631, 758, 633, 632, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 374, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 549, 577, 0, 590, - 0, 438, 439, 0, 0, 0, 0, 0, 0, 0, - 356, 556, 574, 372, 543, 588, 377, 551, 567, 367, - 505, 539, 0, 0, 358, 572, 550, 483, 357, 0, - 532, 397, 414, 394, 503, 0, 0, 571, 601, 393, - 591, 0, 582, 360, 0, 581, 502, 475, 568, 573, - 484, 477, 0, 359, 570, 482, 476, 452, 404, 617, - 453, 454, 455, 456, 457, 458, 418, 518, 473, 519, - 419, 490, 489, 491, 420, 421, 422, 423, 424, 425, - 426, 427, 428, 429, 0, 0, 0, 0, 0, 612, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 750, 0, 0, 755, - 0, 584, 0, 0, 0, 0, 0, 0, 554, 0, - 0, 459, 0, 0, 0, 602, 0, 535, 508, 796, - 0, 0, 533, 471, 569, 520, 575, 557, 583, 527, - 521, 350, 558, 396, 485, 368, 370, 783, 398, 401, - 405, 406, 496, 497, 514, 542, 561, 562, 563, 395, - 382, 534, 383, 415, 384, 351, 387, 386, 388, 544, - 389, 353, 515, 566, 0, 411, 530, 480, 354, 479, - 516, 565, 564, 369, 592, 599, 600, 692, 0, 605, - 797, 798, 799, 614, 0, 522, 365, 362, 0, 0, - 0, 391, 517, 378, 380, 381, 379, 511, 513, 619, - 620, 621, 623, 624, 625, 626, 0, 0, 0, 0, - 627, 693, 711, 677, 646, 607, 701, 643, 647, 648, - 432, 433, 434, 435, 714, 0, 0, 0, 598, 460, - 461, 0, 403, 402, 481, 355, 0, 0, 449, 431, - 523, 361, 399, 451, 437, 462, 463, 464, 465, 466, - 0, 467, 468, 409, 340, 346, 791, 392, 504, 716, - 753, 754, 638, 0, 702, 639, 649, 385, 674, 686, - 685, 498, 597, 0, 697, 700, 628, 790, 0, 694, - 708, 795, 707, 787, 510, 0, 541, 705, 652, 0, - 698, 671, 672, 0, 699, 667, 703, 0, 640, 0, - 608, 611, 642, 729, 730, 731, 352, 610, 733, 734, - 735, 736, 737, 738, 739, 732, 580, 675, 651, 678, - 589, 654, 653, 0, 0, 689, 606, 690, 691, 492, - 493, 494, 495, 413, 717, 376, 609, 525, 526, 0, - 676, 0, 0, 0, 0, 0, 0, 0, 0, 681, - 682, 679, 800, 0, 740, 741, 0, 0, 603, 604, - 408, 0, 622, 416, 375, 509, 410, 587, 440, 0, - 615, 683, 616, 528, 529, 744, 749, 745, 746, 748, - 769, 499, 430, 436, 545, 450, 472, 531, 586, 507, - 536, 373, 576, 547, 478, 668, 696, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 326, 327, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 725, 724, 723, 722, 721, 720, - 719, 718, 0, 0, 665, 390, 788, 782, 789, 770, - 773, 772, 747, 0, 347, 645, 470, 524, 407, 712, - 713, 0, 768, 285, 286, 287, 288, 289, 290, 291, - 292, 333, 293, 294, 295, 296, 297, 298, 299, 304, - 305, 306, 307, 308, 309, 310, 311, 715, 302, 303, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 0, 0, 0, 0, 334, 774, - 775, 776, 777, 778, 0, 0, 335, 336, 337, 0, - 0, 300, 301, 328, 555, 329, 330, 331, 332, 0, - 0, 593, 594, 595, 618, 0, 596, 578, 644, 417, - 348, 559, 585, 785, 786, 0, 0, 0, 0, 0, - 0, 0, 695, 706, 742, 743, 0, 756, 757, 759, - 761, 760, 763, 552, 553, 771, 0, 0, 441, 363, - 364, 500, 501, 538, 0, 442, 443, 444, 448, 445, - 446, 447, 765, 766, 767, 764, 474, 537, 560, 546, - 784, 487, 0, 792, 634, 635, 793, 752, 751, 349, - 0, 338, 339, 709, 710, 0, 0, 540, 486, 641, - 1826, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1823, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 3194, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 1883, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 1883, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 2088, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 2087, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 5424, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 5356, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 1076, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5300, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2219, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4980, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 4945, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 4633, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4465, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 4463, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3682, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3301, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3676, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 4452, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4134, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 2468, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 2470, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 0, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 4399, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3445, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4258, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 4100, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4029, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3897, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 1883, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 2470, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 3724, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3693, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3593, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3574, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3452, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3414, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2768, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3279, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3227, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 3225, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3017, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 2403, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 1455, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 2626, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 2555, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 1926, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1214, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 819, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 1217, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 955, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 954, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 4949, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 4032, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 2468, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 2470, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 0, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 2385, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 1862, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 1860, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 1765, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 906, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 907, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 843, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 0, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 751, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 341, 342, 343, 344, 345, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 506, 0, 0, 650, - 684, 673, 762, 637, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 400, 0, 0, 469, 688, 669, - 680, 670, 512, 655, 656, 657, 664, 412, 658, 794, - 660, 629, 661, 630, 662, 663, 0, 687, 636, 548, - 488, 0, 704, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 371, 270, 631, 758, 633, 632, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 549, 577, 0, - 590, 0, 438, 439, 0, 0, 0, 0, 0, 0, - 0, 356, 556, 574, 372, 543, 588, 377, 551, 567, - 367, 505, 539, 0, 0, 358, 572, 550, 483, 357, - 0, 532, 397, 414, 394, 503, 0, 0, 571, 601, - 393, 591, 0, 582, 360, 0, 581, 502, 475, 568, - 573, 484, 477, 0, 359, 570, 482, 476, 452, 404, - 617, 453, 454, 455, 456, 457, 458, 418, 518, 473, - 519, 419, 490, 489, 491, 420, 421, 422, 423, 424, - 425, 426, 427, 428, 429, 0, 0, 0, 0, 0, - 612, 613, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 750, 0, 0, - 755, 0, 584, 0, 0, 0, 0, 0, 0, 554, - 0, 0, 459, 0, 0, 0, 602, 0, 535, 508, - 796, 0, 0, 533, 471, 569, 520, 575, 557, 583, - 527, 521, 350, 558, 396, 485, 368, 370, 783, 398, - 401, 405, 406, 496, 497, 514, 542, 561, 562, 563, - 395, 382, 534, 383, 415, 384, 351, 387, 386, 388, - 544, 389, 353, 515, 566, 0, 411, 530, 480, 354, - 479, 516, 565, 564, 369, 592, 599, 600, 692, 0, - 605, 797, 798, 799, 614, 0, 522, 365, 362, 0, - 0, 0, 391, 517, 378, 380, 381, 379, 511, 513, - 619, 620, 621, 623, 624, 625, 626, 0, 0, 0, - 0, 627, 693, 711, 677, 646, 607, 701, 643, 647, - 648, 432, 433, 434, 435, 714, 0, 0, 0, 598, - 460, 461, 0, 403, 402, 481, 355, 0, 0, 449, - 431, 523, 361, 399, 451, 437, 462, 463, 464, 465, - 466, 0, 467, 468, 409, 340, 346, 791, 392, 504, - 716, 753, 754, 638, 0, 702, 639, 649, 385, 674, - 686, 685, 498, 597, 0, 697, 700, 628, 790, 0, - 694, 708, 795, 707, 787, 510, 0, 541, 705, 652, - 0, 698, 671, 672, 0, 699, 667, 703, 0, 640, - 0, 608, 611, 642, 729, 730, 731, 352, 610, 733, - 734, 735, 736, 737, 738, 739, 732, 580, 675, 651, - 678, 589, 654, 653, 0, 0, 689, 606, 690, 691, - 492, 493, 494, 495, 413, 717, 376, 609, 525, 526, - 0, 676, 0, 0, 0, 0, 0, 0, 0, 0, - 681, 682, 679, 800, 0, 740, 741, 0, 0, 603, - 604, 408, 0, 622, 416, 375, 509, 410, 587, 440, - 0, 615, 683, 616, 528, 529, 744, 749, 745, 746, - 748, 769, 499, 430, 436, 545, 450, 472, 531, 586, - 507, 536, 373, 576, 547, 478, 668, 696, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 326, - 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 725, 724, 723, 722, 721, - 720, 719, 718, 0, 0, 665, 390, 788, 782, 789, - 770, 773, 772, 747, 0, 347, 645, 470, 524, 407, - 712, 713, 0, 768, 285, 286, 287, 288, 289, 290, - 291, 292, 333, 293, 294, 295, 296, 297, 298, 299, - 304, 305, 306, 307, 308, 309, 310, 311, 715, 302, - 303, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 0, 0, 0, 0, 334, - 774, 775, 776, 777, 778, 0, 0, 335, 336, 337, - 0, 0, 300, 301, 328, 555, 329, 330, 331, 332, - 0, 0, 593, 594, 595, 618, 0, 596, 578, 644, - 417, 348, 559, 585, 785, 786, 0, 0, 0, 0, - 0, 0, 0, 695, 706, 742, 743, 0, 756, 757, - 759, 761, 760, 763, 552, 553, 771, 0, 0, 441, - 363, 364, 500, 501, 538, 0, 442, 443, 444, 448, - 445, 446, 447, 765, 766, 767, 764, 474, 537, 560, - 546, 784, 487, 0, 792, 634, 635, 793, 752, 0, - 349, 0, 338, 339, 709, 710, 0, 0, 540, 486, - 641, 928, 927, 934, 924, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 931, 932, 0, 933, 937, 0, - 0, 918, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 942, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 946, - 0, 0, 948, 0, 0, 0, 0, 947, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1005, 5419, 980, 5438, 1007, 5404, 5472, 4996, 5411, 5408, + 270, 5456, 2016, 5300, 3729, 5403, 5387, 5428, 5294, 5007, + 3864, 4558, 990, 5238, 4011, 2017, 4623, 4568, 2169, 5304, + 4237, 5305, 5293, 5005, 3733, 4218, 4063, 5162, 3243, 5227, + 4891, 4311, 5069, 1902, 4808, 4534, 3514, 4997, 3744, 4938, + 3298, 5086, 4835, 3014, 4065, 4312, 4618, 1674, 793, 2228, + 5004, 5128, 4718, 3635, 5239, 5008, 4990, 4432, 1510, 2244, + 5241, 4309, 3747, 1036, 1282, 4762, 816, 1919, 4968, 1275, + 3510, 3901, 1957, 257, 5, 2231, 4446, 4631, 833, 843, + 4440, 853, 1517, 4135, 853, 3109, 1485, 4518, 4200, 4747, + 3429, 3428, 4205, 1918, 3454, 4489, 3512, 4725, 4731, 4134, + 3681, 3647, 2172, 3636, 4391, 1432, 4116, 4701, 982, 4292, + 3637, 2472, 3422, 1284, 3033, 2502, 3291, 3865, 4120, 2629, + 4430, 1920, 3828, 3863, 3760, 4202, 4233, 1481, 175, 847, + 16, 4212, 4467, 932, 3718, 1549, 3712, 3336, 3530, 16, + 255, 2495, 3860, 3522, 2626, 3716, 2679, 4260, 3710, 3849, + 923, 4381, 3614, 2804, 848, 34, 4098, 4084, 2250, 3481, + 4096, 3238, 972, 927, 34, 4211, 2111, 2227, 1895, 3123, + 4137, 4136, 4147, 3054, 2027, 2365, 3039, 3042, 3629, 1190, + 3034, 1932, 2005, 4132, 2009, 2957, 2956, 1823, 973, 4043, + 3271, 3528, 2000, 1985, 2847, 2800, 833, 1235, 1790, 2684, + 3249, 2643, 2799, 3335, 2622, 839, 1990, 3602, 904, 3596, + 977, 2496, 3762, 244, 3213, 3650, 3088, 2022, 3685, 2503, + 3053, 4, 2504, 3684, 1821, 1739, 3031, 3110, 3016, 266, + 7, 793, 3037, 3207, 265, 6, 3735, 1269, 2435, 844, + 17, 2245, 2801, 2164, 833, 1349, 2030, 3044, 981, 17, + 2768, 2516, 3006, 2168, 1835, 3041, 1911, 1880, 2843, 2478, + 270, 1958, 270, 1520, 1339, 1340, 815, 1874, 1865, 2462, + 971, 2959, 833, 2206, 2238, 2155, 3009, 1547, 2110, 1671, + 1266, 1450, 3113, 1499, 2040, 991, 2701, 1965, 2425, 26, + 2430, 2163, 1467, 1268, 1291, 792, 251, 846, 15, 1154, + 1879, 973, 2434, 1863, 1876, 2456, 1234, 15, 845, 40, + 1155, 1151, 1828, 920, 929, 250, 5388, 2251, 40, 1232, + 1765, 834, 256, 3214, 930, 1824, 1495, 1840, 5, 1153, + 849, 46, 88, 56, 926, 1318, 1675, 1156, 852, 1822, + 46, 1214, 44, 31, 1227, 80, 89, 27, 1521, 30, + 888, 243, 19, 10, 158, 83, 1150, 82, 78, 2483, + 2487, 2488, 2489, 2484, 2494, 2485, 2491, 2773, 5113, 2486, + 1598, 2492, 1599, 1597, 1286, 1598, 4964, 1599, 1597, 3478, + 1598, 3478, 1599, 1597, 16, 3478, 2483, 2487, 2488, 2489, + 2484, 2494, 2485, 2491, 2508, 1336, 2486, 4487, 2492, 16, + 3683, 16, 4325, 2393, 3215, 4172, 4054, 4053, 3916, 34, + 1335, 3915, 1337, 2816, 1433, 1766, 4681, 4449, 1434, 978, + 4304, 3370, 3277, 1904, 34, 823, 34, 3275, 1767, 3274, + 3272, 825, 857, 2382, 819, 820, 1332, 821, 822, 1968, + 1331, 254, 2483, 2487, 2488, 2489, 2484, 2494, 2485, 2491, + 1972, 3455, 2486, 4883, 2492, 4181, 3423, 2920, 1372, 1288, + 3032, 4490, 2483, 2487, 2488, 2489, 2484, 2494, 2485, 2491, + 3299, 818, 2486, 2955, 2492, 1760, 1330, 2475, 2139, 1540, + 1433, 3853, 3854, 1533, 7, 3208, 1534, 917, 3290, 6, + 1477, 1478, 1479, 1878, 17, 1332, 5216, 5140, 1717, 1476, + 2483, 2487, 2488, 2489, 2484, 2494, 2485, 2491, 2726, 17, + 2486, 17, 2492, 2031, 4330, 2761, 1332, 2762, 2757, 1936, + 1851, 1794, 4465, 3244, 4055, 1147, 1475, 2961, 4665, 2727, + 4051, 2971, 2389, 1769, 4029, 4026, 5399, 1538, 9, 2376, + 5154, 2951, 1748, 1970, 4036, 4034, 4616, 1177, 1372, 3896, + 1174, 3894, 15, 2689, 1281, 1598, 4800, 1599, 1597, 1598, + 4318, 1599, 1597, 40, 5302, 5301, 5081, 15, 4899, 15, + 4892, 4619, 4027, 1279, 4310, 4024, 5244, 3036, 40, 1669, + 40, 1280, 1283, 1152, 1091, 46, 2373, 1536, 3989, 4038, + 2229, 2230, 3187, 4082, 2708, 1390, 1391, 1352, 2797, 3152, + 46, 5443, 46, 5096, 5395, 4910, 2084, 5093, 1165, 4670, + 4907, 4950, 4420, 3403, 2978, 5174, 1468, 1933, 1380, 1384, + 1386, 1388, 1393, 4668, 1398, 1394, 1395, 1396, 1397, 1775, + 1773, 1375, 1376, 1377, 1378, 1350, 1351, 1381, 1147, 1353, + 2036, 1354, 1356, 1357, 1358, 1359, 1355, 1360, 1361, 1362, + 1363, 1364, 1371, 1373, 1365, 1366, 1367, 1368, 1369, 1370, + 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1408, 1407, + 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1383, 1385, + 1387, 1389, 1392, 1772, 4415, 1390, 1391, 1352, 4085, 2577, + 2995, 1178, 1175, 1293, 1138, 925, 1137, 1139, 1140, 3984, + 1141, 1142, 2814, 1817, 3858, 3010, 4952, 3509, 1380, 1384, + 1386, 1388, 1393, 3234, 1398, 1394, 1395, 1396, 1397, 1374, + 1166, 1375, 1376, 1377, 1378, 1350, 1351, 1381, 1473, 1353, + 1474, 1354, 1356, 1357, 1358, 1359, 1355, 1360, 1361, 1362, + 1363, 1364, 1371, 1373, 1365, 1366, 1367, 1368, 1369, 1370, + 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1408, 1407, + 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1383, 1385, + 1387, 1389, 1392, 1178, 4028, 1594, 1175, 4025, 961, 2592, + 2102, 963, 3507, 1535, 961, 3221, 962, 963, 3220, 2034, + 2617, 3222, 962, 3900, 2156, 1533, 3235, 2160, 1534, 2402, + 2400, 3870, 3871, 2639, 2606, 2607, 1971, 1969, 833, 1374, + 2033, 2407, 2408, 1881, 3869, 1883, 1782, 2605, 833, 1472, + 3193, 2159, 3192, 833, 3598, 1436, 2286, 4039, 2490, 3348, + 3347, 1507, 1516, 3505, 3599, 3292, 1515, 1518, 1519, 4222, + 5360, 1342, 1625, 4220, 1631, 853, 853, 1464, 961, 1518, + 1519, 963, 4499, 4062, 913, 2490, 962, 1587, 2171, 1435, + 1628, 1630, 1624, 3506, 1629, 1611, 1610, 1620, 1621, 1622, + 1623, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1612, 5308, + 5309, 1626, 2126, 2150, 3597, 1592, 3075, 1278, 2488, 2489, + 979, 1427, 4918, 1277, 1625, 1176, 1631, 2867, 1173, 1536, + 5248, 5344, 5247, 5343, 1574, 5246, 5342, 1575, 3502, 833, + 833, 2490, 1628, 1630, 1624, 1172, 1629, 1611, 1610, 1620, + 1621, 1622, 1623, 1613, 1614, 1615, 1616, 1617, 1618, 1619, + 1612, 2490, 5248, 1626, 4909, 1577, 2100, 5245, 5341, 5247, + 1426, 5246, 5260, 5245, 5338, 2927, 1514, 4313, 1428, 5084, + 2161, 5229, 5229, 1511, 3902, 1511, 1487, 5390, 5391, 3907, + 5232, 833, 2392, 4672, 1539, 4313, 3903, 1537, 3904, 2490, + 1286, 4895, 3321, 2175, 2158, 1858, 1937, 4744, 1852, 5112, + 1644, 2818, 1795, 4037, 1437, 2623, 1759, 4963, 5124, 3503, + 4337, 3782, 3946, 4334, 4431, 1484, 3477, 2613, 4110, 1637, + 206, 252, 2810, 1493, 2815, 3641, 2151, 3508, 1434, 3206, + 1503, 4710, 4112, 4438, 830, 2175, 1434, 3195, 3942, 1523, + 1524, 3519, 1526, 1527, 1861, 1434, 1529, 3004, 1436, 5087, + 5088, 5089, 5090, 3850, 2148, 206, 252, 205, 239, 207, + 3917, 4954, 4955, 1440, 1444, 3914, 1447, 1590, 1591, 1382, + 2852, 3643, 4107, 4108, 4547, 1288, 4669, 5262, 1567, 3940, + 1572, 1569, 1679, 2772, 2728, 1505, 2493, 3471, 4109, 1589, + 4056, 1453, 1456, 2962, 4917, 4184, 3634, 1332, 5307, 1332, + 2101, 3362, 4919, 236, 1332, 3186, 1332, 3189, 1554, 1570, + 3150, 1434, 1562, 2493, 2157, 1535, 1332, 1332, 3188, 2403, + 2401, 4617, 842, 1801, 2817, 2637, 2638, 1579, 1254, 4760, + 1580, 841, 1286, 1585, 1586, 3895, 206, 252, 205, 239, + 207, 3841, 1573, 3198, 3199, 4960, 3638, 1799, 2735, 3197, + 4877, 4707, 1458, 3504, 2174, 2173, 1281, 4874, 1582, 1382, + 2575, 4876, 1457, 4875, 4666, 4117, 1678, 4118, 3299, 2493, + 3273, 3605, 3480, 2148, 1973, 1425, 4908, 3211, 1584, 1762, + 1764, 5073, 1768, 1280, 1501, 1502, 814, 2144, 4577, 2493, + 5038, 1767, 1429, 4465, 1169, 1528, 2174, 2173, 1786, 4433, + 5135, 4224, 1789, 1767, 5136, 5139, 5138, 1953, 1152, 1798, + 2714, 1774, 245, 1462, 1463, 4106, 823, 1288, 1771, 1347, + 4035, 5116, 825, 1469, 1576, 819, 820, 2493, 821, 822, + 2826, 2828, 2829, 4941, 1563, 1734, 4953, 4735, 1738, 833, + 833, 833, 4682, 4671, 1235, 4235, 4236, 1496, 1500, 1500, + 1500, 4234, 1850, 1541, 1542, 1531, 1532, 833, 4455, 1857, + 1565, 1522, 1864, 4298, 1525, 4573, 1551, 833, 4131, 1170, + 3601, 793, 793, 1568, 1571, 1496, 1496, 4148, 5158, 1553, + 2616, 793, 793, 1578, 253, 1906, 1906, 1737, 833, 3644, + 5142, 3651, 4395, 2576, 4397, 5001, 1564, 1741, 1645, 5102, + 1800, 4980, 3018, 1220, 1246, 1244, 1179, 1245, 5104, 1347, + 5105, 855, 1518, 1519, 837, 838, 1518, 1519, 853, 253, + 816, 4118, 854, 1583, 4553, 3856, 5098, 1961, 3012, 1908, + 4044, 1455, 1454, 5129, 4559, 1249, 2822, 2824, 2825, 5163, + 5242, 5187, 4219, 270, 3749, 1581, 4104, 4566, 2990, 5104, + 1171, 5105, 793, 1506, 2035, 3618, 3624, 3625, 3626, 3619, + 3623, 3620, 3622, 3621, 1913, 206, 252, 205, 239, 207, + 1494, 4947, 3640, 1929, 1930, 2490, 4690, 4493, 1566, 4226, + 4406, 4227, 4229, 4228, 964, 965, 966, 967, 968, 1781, + 964, 965, 966, 967, 968, 3125, 4674, 4675, 4676, 4075, + 253, 3108, 3127, 1859, 3185, 1690, 1691, 5106, 1255, 4579, + 4578, 4230, 1792, 1793, 5123, 2624, 1796, 2149, 4493, 4113, + 3205, 1805, 1807, 1808, 1809, 1810, 3943, 1812, 2013, 1154, + 4118, 1816, 1448, 2018, 3745, 3746, 4409, 3749, 1862, 3851, + 4796, 245, 2145, 5466, 2032, 3125, 4785, 3163, 5106, 4956, + 3162, 3108, 3127, 5261, 964, 965, 966, 967, 968, 3126, + 1250, 1900, 1901, 4239, 206, 252, 205, 239, 207, 5431, + 2058, 1745, 3783, 1744, 3784, 3785, 2061, 4711, 1281, 4225, + 2082, 2810, 16, 4634, 1839, 5002, 1770, 2614, 3611, 1460, + 2095, 4981, 1742, 1891, 1168, 3646, 2152, 1732, 1890, 1223, + 1906, 1224, 4240, 4791, 4408, 1280, 1864, 34, 3812, 3126, + 2021, 843, 3183, 3184, 2148, 2025, 1552, 1492, 1885, 1887, + 1733, 1491, 1252, 1490, 1627, 4969, 3122, 2827, 1898, 1899, + 5292, 2045, 2125, 1509, 1508, 5164, 4201, 5010, 4360, 1864, + 245, 2028, 3473, 3153, 2134, 2134, 1829, 1864, 4468, 2083, + 3108, 4614, 1864, 1864, 2747, 2748, 833, 1791, 1511, 925, + 851, 5226, 3604, 1804, 1983, 3133, 1986, 1987, 2023, 1906, + 1877, 1906, 1436, 1834, 1559, 1980, 1627, 4392, 1806, 1992, + 1993, 1994, 1995, 1996, 1997, 4264, 1827, 1991, 2096, 2002, + 2003, 3645, 17, 1830, 1831, 1917, 1949, 1916, 2008, 1974, + 1923, 2012, 2011, 4476, 1219, 2004, 2170, 4244, 1889, 4105, + 2116, 2066, 3358, 4235, 4236, 1632, 1914, 3608, 3609, 1922, + 3226, 2087, 2090, 2091, 2094, 5432, 81, 2124, 2129, 253, + 2127, 2128, 3607, 2823, 3191, 3148, 2070, 2960, 2807, 2108, + 2109, 851, 3090, 3092, 2612, 1906, 1283, 1931, 1248, 3017, + 15, 206, 252, 205, 239, 207, 2118, 2119, 2600, 1634, + 1633, 40, 825, 1436, 2248, 2019, 1947, 2044, 2991, 1788, + 914, 2048, 2049, 1962, 2026, 1963, 3250, 3251, 2131, 1558, + 2299, 2280, 2281, 46, 1777, 2285, 4238, 2138, 1951, 3119, + 1870, 5099, 1637, 2300, 1802, 5100, 1545, 2246, 5009, 1811, + 2289, 2290, 2291, 2181, 2185, 2186, 2307, 81, 2309, 2384, + 2310, 2311, 2312, 2305, 2182, 2130, 2306, 4423, 4127, 3116, + 1803, 2067, 4591, 2137, 1779, 4281, 3648, 245, 253, 3491, + 4266, 4787, 5099, 3945, 2081, 4786, 5240, 2327, 2328, 1943, + 5291, 1815, 3835, 1814, 1813, 817, 1256, 919, 3116, 3119, + 918, 4799, 2046, 2183, 2136, 4340, 2056, 4231, 2050, 1247, + 2581, 2579, 4338, 2103, 1242, 2580, 916, 2360, 1436, 915, + 1236, 1243, 4792, 4793, 5429, 5430, 2167, 1154, 1209, 2065, + 2394, 2819, 2820, 2112, 2397, 2114, 2115, 1222, 1253, 833, + 833, 833, 2844, 3813, 3815, 3816, 3817, 3814, 2412, 2414, + 2122, 2415, 2378, 2418, 2419, 1286, 4382, 2422, 2117, 3132, + 816, 2426, 2075, 3130, 2076, 2074, 2431, 2361, 1906, 2437, + 2438, 2123, 2440, 1864, 2072, 2073, 2371, 833, 2064, 2069, + 1906, 2063, 2165, 2187, 2068, 2062, 833, 2107, 3780, 2283, + 2140, 2141, 2113, 1791, 1235, 3091, 1208, 2473, 2363, 2317, + 2319, 2318, 3120, 3319, 1838, 2498, 2498, 1850, 2498, 1496, + 2591, 3921, 2509, 2510, 833, 833, 2385, 2574, 3499, 4477, + 851, 2431, 2585, 1500, 914, 4128, 2366, 2133, 2135, 2370, + 1906, 833, 2597, 2598, 2984, 2983, 1500, 1850, 3115, 793, + 1288, 1988, 2162, 3117, 1989, 1639, 1640, 1641, 1642, 1643, + 1238, 1239, 1240, 793, 2166, 1906, 828, 4324, 829, 2982, + 2007, 2590, 3120, 206, 252, 253, 1184, 3115, 3108, 3114, + 1785, 3111, 3117, 1783, 1784, 206, 252, 2410, 2411, 1191, + 2208, 2526, 4399, 2106, 1776, 4050, 81, 2316, 2981, 2390, + 206, 252, 2409, 1180, 1867, 2655, 2657, 3118, 252, 833, + 2431, 1906, 3175, 2664, 1181, 833, 923, 923, 4748, 2426, + 2466, 252, 3008, 2672, 3643, 2674, 2675, 2676, 2386, 851, + 916, 2680, 1486, 915, 2528, 2369, 3118, 2372, 270, 5468, + 1188, 270, 270, 2042, 270, 1186, 1185, 2374, 3492, 245, + 1182, 2463, 2041, 4232, 2439, 1286, 206, 252, 1292, 2441, + 2184, 245, 2106, 4288, 2106, 2583, 2298, 2500, 2057, 2506, + 1257, 1925, 2602, 2420, 2421, 5236, 2465, 5072, 5214, 4323, + 2427, 2428, 2429, 245, 2054, 2055, 2006, 2640, 1303, 2455, + 2313, 2314, 2442, 2443, 2444, 81, 245, 1778, 1780, 2716, + 5513, 2678, 1596, 2645, 2646, 3803, 3804, 1292, 2734, 2698, + 2192, 2193, 2194, 2195, 2196, 2197, 2198, 2199, 2200, 2201, + 2202, 2203, 3112, 1868, 1281, 2632, 2633, 2364, 2742, 2739, + 2224, 2225, 245, 3658, 2609, 2618, 2611, 1187, 2232, 2148, + 1288, 2436, 793, 2362, 1251, 4283, 2424, 2630, 2631, 914, + 1559, 1280, 2944, 2450, 2660, 3007, 2249, 2754, 5512, 2756, + 2666, 2284, 2383, 2760, 2387, 1184, 1326, 1327, 1328, 2391, + 2625, 2765, 2766, 2767, 1866, 4458, 2771, 16, 1864, 2601, + 16, 16, 5497, 16, 2308, 2663, 1596, 2641, 2688, 3083, + 2042, 2691, 2692, 4171, 2694, 2712, 2603, 3147, 1486, 2041, + 2806, 1325, 34, 2595, 1322, 34, 34, 1864, 34, 833, + 833, 2039, 2588, 2461, 3679, 833, 851, 2473, 2729, 833, + 2470, 1285, 2474, 2468, 2469, 1906, 2803, 904, 2457, 1183, + 1285, 2582, 2454, 2457, 1186, 1185, 3525, 253, 1189, 2464, + 1596, 2271, 206, 252, 1596, 916, 2586, 3802, 915, 253, + 2042, 2042, 2594, 2024, 2755, 2677, 4378, 2758, 2759, 2041, + 2041, 2763, 4336, 3216, 253, 2608, 2619, 2610, 1596, 2705, + 1825, 253, 3526, 3527, 2165, 2775, 2776, 206, 252, 205, + 239, 207, 81, 3680, 253, 2778, 2779, 17, 4287, 1486, + 17, 17, 5503, 17, 4809, 4810, 4811, 4815, 4813, 4814, + 4816, 4817, 4818, 4819, 4812, 2831, 2649, 2654, 2650, 2764, + 2661, 2106, 2662, 2786, 3083, 1453, 1456, 2669, 245, 2788, + 253, 2790, 2153, 2106, 2718, 2736, 2737, 2648, 3357, 2713, + 2783, 2717, 2685, 2042, 206, 252, 4247, 2743, 2795, 2667, + 2668, 5495, 2041, 5487, 1442, 15, 2888, 4019, 15, 15, + 2887, 15, 2154, 245, 2723, 4288, 40, 5483, 4245, 40, + 40, 5479, 40, 1559, 5453, 1598, 2703, 1599, 1597, 206, + 252, 1556, 3680, 2106, 1598, 4193, 1599, 1597, 46, 206, + 252, 46, 46, 2791, 46, 2720, 1457, 1735, 2678, 206, + 252, 5450, 1319, 1320, 1321, 1324, 1596, 1323, 2106, 5447, + 206, 252, 205, 239, 207, 4706, 3083, 2806, 2738, 5445, + 2722, 4190, 2741, 1557, 2744, 2740, 2898, 2806, 1286, 2901, + 4320, 2903, 4016, 4091, 3981, 5440, 5425, 1596, 2910, 5153, + 4158, 5379, 2746, 4020, 4088, 4042, 1596, 5364, 2721, 3664, + 1292, 2923, 5324, 5480, 2106, 245, 4288, 5480, 2587, 1598, + 5454, 1599, 1597, 2097, 2098, 245, 2963, 2964, 1867, 2966, + 2967, 2777, 1557, 2970, 2770, 245, 2774, 2784, 2267, 3474, + 2785, 833, 1864, 833, 1864, 2264, 245, 5451, 1892, 2266, + 2263, 2265, 2269, 2270, 2985, 5448, 5323, 2268, 3296, 5322, + 2805, 2992, 2993, 2787, 972, 2812, 5317, 5481, 833, 833, + 833, 3237, 2794, 1288, 3005, 2850, 253, 2943, 4017, 2798, + 1559, 5441, 5365, 833, 833, 833, 1735, 5380, 5310, 2926, + 2928, 2929, 2930, 5365, 2932, 2809, 2604, 3102, 5325, 1159, + 1160, 1161, 1162, 2864, 2781, 2942, 3040, 3040, 3046, 2954, + 2941, 253, 2697, 2940, 2897, 3055, 1850, 1850, 1850, 1850, + 1850, 1850, 1850, 1850, 2830, 1455, 1454, 2896, 1500, 5288, + 5188, 5185, 2845, 5152, 2832, 2895, 5146, 2750, 2498, 2837, + 3357, 2635, 1596, 1008, 1018, 1596, 2208, 1868, 2599, 5029, + 2805, 2208, 2812, 1009, 1833, 1010, 1014, 1017, 1013, 1011, + 1012, 3094, 2854, 2204, 2205, 2235, 3139, 5028, 253, 2222, + 2223, 5063, 2320, 2226, 2862, 2323, 2324, 2325, 4872, 4487, + 2329, 2330, 2331, 2332, 2334, 2335, 2336, 2337, 2338, 2339, + 2340, 2341, 2343, 2344, 2345, 2346, 2347, 1598, 1866, 1599, + 1597, 5025, 4480, 253, 5024, 2274, 2275, 2276, 2277, 2278, + 2279, 2272, 2273, 253, 4870, 5289, 2812, 2862, 2975, 5153, + 2977, 1015, 1596, 253, 1159, 1160, 1161, 1162, 2106, 1446, + 2935, 5023, 3977, 1906, 253, 2812, 1159, 1160, 1161, 1162, + 833, 2134, 2949, 1157, 1286, 5022, 2946, 2947, 3146, 3886, + 3116, 3119, 1016, 2812, 5021, 1157, 2780, 1598, 3682, 1599, + 1597, 793, 793, 5003, 1598, 2933, 1599, 1597, 1163, 1436, + 4966, 2861, 4935, 1154, 4932, 1906, 833, 1598, 1482, 1599, + 1597, 4767, 1483, 2835, 2836, 3663, 4493, 2862, 2840, 2841, + 2862, 4766, 1598, 3043, 1599, 1597, 4692, 2082, 4691, 3245, + 3246, 3487, 1598, 1679, 1599, 1597, 833, 3360, 4586, 2965, + 4514, 816, 833, 2969, 3333, 1612, 2936, 2862, 3203, 1961, + 3359, 1928, 3262, 3980, 3264, 4510, 4504, 270, 3320, 1288, + 4501, 2862, 1598, 3025, 1599, 1597, 3708, 3105, 3107, 3106, + 2862, 3128, 3129, 4474, 2996, 4371, 1439, 1441, 3056, 4515, + 4367, 2934, 851, 2999, 4255, 3257, 2862, 4153, 1596, 3082, + 3051, 2860, 3190, 3040, 3040, 3305, 3968, 4768, 1598, 2883, + 1599, 1597, 3316, 1598, 2866, 1599, 1597, 3051, 3912, 3910, + 2789, 3668, 4193, 4437, 4190, 3666, 3326, 1678, 3047, 3048, + 3660, 3450, 2745, 1163, 2148, 3448, 4515, 3435, 3331, 2683, + 3081, 3076, 3334, 3337, 3223, 1163, 3224, 3427, 3339, 3372, + 3355, 4511, 4193, 1906, 3120, 4277, 4190, 3101, 81, 3115, + 3108, 3114, 3217, 3111, 3117, 3229, 3230, 2939, 4584, 1596, + 3353, 4372, 2858, 3287, 2388, 3103, 4368, 3024, 2037, 2803, + 4256, 3285, 3029, 3661, 3283, 3281, 1906, 1653, 1906, 2464, + 2464, 3248, 1596, 1436, 3057, 3058, 3059, 3060, 3061, 3062, + 3063, 3371, 3084, 3050, 3667, 3661, 16, 3669, 2945, 1443, + 1445, 3667, 2906, 2905, 2886, 851, 3661, 3267, 3118, 2877, + 2876, 1596, 4176, 1596, 2875, 3300, 1459, 3366, 2863, 2811, + 1422, 34, 2051, 1596, 2634, 1596, 3051, 3204, 1417, 2849, + 2848, 1286, 1906, 1436, 3937, 2588, 4149, 3406, 1885, 1887, + 1978, 1977, 3218, 2121, 3344, 5143, 3236, 3212, 2416, 3288, + 3349, 1634, 1633, 4982, 3415, 2288, 2287, 3286, 3951, 1906, + 3282, 3282, 1530, 3407, 3330, 1632, 4749, 2246, 3332, 2288, + 2287, 81, 3233, 3272, 4609, 3401, 4471, 3354, 3083, 3051, + 3043, 1482, 3343, 4469, 2944, 1483, 1632, 2417, 1596, 1596, + 1596, 5144, 3350, 3351, 3112, 1596, 1596, 1482, 3451, 3928, + 1596, 1483, 3416, 1896, 2862, 2812, 17, 4640, 2052, 1634, + 1633, 3294, 4750, 3340, 1897, 3297, 1288, 3253, 3293, 4150, + 3261, 1894, 4472, 5469, 3322, 3323, 5455, 3324, 3325, 4470, + 1634, 1633, 3482, 3484, 1447, 3301, 5452, 5449, 5394, 3489, + 2593, 5114, 3493, 3421, 5055, 4983, 3425, 1497, 5054, 833, + 833, 833, 3304, 4965, 4903, 4868, 3314, 4833, 4789, 3303, + 4788, 4714, 4481, 4448, 15, 4151, 4302, 1482, 4289, 1436, + 3592, 1483, 4279, 2333, 4269, 40, 4257, 3430, 1906, 3328, + 4195, 1864, 4192, 3436, 3368, 4122, 3844, 2326, 1864, 2585, + 3363, 4984, 3843, 3424, 2092, 2088, 2232, 46, 3040, 3431, + 3670, 3341, 3453, 3533, 3665, 3386, 3404, 3389, 3616, 3479, + 3457, 3369, 3459, 3460, 3327, 3228, 2968, 3467, 2732, 2731, + 2730, 3356, 3675, 3678, 5281, 3383, 2047, 1893, 3532, 3361, + 1598, 3352, 1599, 1597, 2043, 4639, 1819, 3381, 3232, 2165, + 1818, 4305, 1438, 3266, 3468, 1615, 1616, 1617, 1618, 1619, + 1612, 3656, 2686, 3652, 1850, 4064, 1850, 1613, 1614, 1615, + 1616, 1617, 1618, 1619, 1612, 5280, 3714, 3720, 3671, 3672, + 1498, 5148, 3373, 3374, 3517, 2239, 1436, 3376, 3377, 2239, + 1826, 2855, 2833, 2834, 3402, 3739, 3391, 2838, 2839, 1966, + 1826, 2686, 2458, 3750, 1436, 3630, 3752, 3753, 3754, 1436, + 1436, 1436, 2134, 5, 1825, 1436, 3765, 3887, 3766, 3767, + 4067, 3768, 5340, 3770, 3771, 1482, 1482, 2093, 2089, 1483, + 1483, 4991, 3633, 4934, 3765, 4933, 4067, 1597, 3751, 1598, + 3723, 1599, 1597, 4803, 3756, 3757, 2219, 2498, 2526, 3761, + 3276, 4802, 3955, 4154, 3469, 3470, 5465, 1598, 3466, 1599, + 1597, 3825, 2216, 2218, 2215, 4490, 2217, 3612, 1598, 16, + 1599, 1597, 4778, 1598, 3631, 1599, 1597, 4303, 793, 3731, + 3772, 1906, 3385, 1906, 3769, 3742, 3342, 1598, 2214, 1599, + 1597, 2528, 2585, 3740, 34, 1966, 1436, 1436, 1826, 4777, + 4064, 3615, 3755, 2455, 2211, 2213, 2210, 1906, 2212, 1598, + 974, 1599, 1597, 1598, 4066, 1599, 1597, 3867, 3268, 2106, + 2029, 2106, 3028, 5464, 3845, 3594, 1599, 1597, 833, 1655, + 3866, 3866, 1598, 1436, 1599, 1597, 3610, 3883, 3639, 5207, + 5208, 1850, 1654, 3655, 5329, 3593, 3830, 3595, 3414, 270, + 3654, 2436, 2870, 1598, 270, 1599, 1597, 1598, 5316, 1599, + 1597, 3674, 1967, 3677, 3462, 3673, 3463, 3533, 3847, 7, + 3690, 3691, 3688, 3689, 6, 5205, 5206, 3239, 3240, 17, + 1961, 3908, 3410, 1603, 1604, 1605, 1606, 1607, 1608, 1609, + 1601, 5276, 3532, 3700, 3702, 5059, 5060, 3145, 3701, 5211, + 3417, 3919, 3738, 3151, 5210, 3722, 3154, 3155, 3156, 3157, + 3158, 3159, 3160, 3161, 3337, 3836, 3164, 3165, 3166, 3167, + 3168, 3169, 3170, 3171, 3172, 3173, 3174, 3734, 3176, 3177, + 3178, 3179, 3180, 4708, 3181, 3884, 3758, 15, 1906, 3737, + 3642, 3939, 5209, 3741, 3725, 5204, 3852, 1598, 40, 1599, + 1597, 1598, 3868, 1599, 1597, 1598, 3786, 1599, 1597, 3200, + 4435, 3202, 3909, 3705, 3706, 3707, 3885, 5203, 3799, 3824, + 46, 1610, 1620, 1621, 1622, 1623, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 1612, 3736, 3736, 3822, 5367, 16, 3736, + 4715, 4716, 5421, 16, 3839, 4709, 3820, 2303, 3809, 3888, + 3970, 3308, 3848, 5202, 3892, 5201, 5200, 3922, 5297, 3924, + 5199, 3307, 2304, 34, 1598, 5197, 1599, 1597, 34, 3872, + 3929, 2106, 4436, 3875, 5196, 3842, 5195, 3931, 3932, 3877, + 5194, 3823, 5422, 4013, 3882, 1598, 5193, 1599, 1597, 3881, + 5192, 5190, 5171, 5189, 3876, 3930, 5145, 3511, 3821, 3923, + 5032, 3890, 3926, 3927, 5013, 4985, 4959, 1091, 3819, 3889, + 3808, 4048, 2859, 4931, 2879, 3969, 2857, 4893, 4052, 1598, + 3933, 1599, 1597, 4057, 4798, 833, 1864, 4032, 1333, 1334, + 4441, 4752, 4751, 1338, 4069, 4071, 4072, 4074, 4596, 4076, + 4077, 4560, 1598, 3973, 1599, 1597, 4473, 4434, 17, 5420, + 4416, 3905, 4111, 17, 3985, 1436, 3987, 3941, 3990, 3991, + 3920, 3899, 3936, 3992, 3993, 3994, 3995, 3996, 3898, 3997, + 3998, 3999, 4000, 4001, 4002, 4003, 4004, 3925, 4006, 4007, + 4008, 4009, 3833, 3807, 4447, 4014, 2878, 3806, 4018, 4089, + 4021, 4022, 1598, 3935, 1599, 1597, 1598, 3948, 1599, 1597, + 3805, 4097, 3797, 3791, 3790, 3789, 15, 3967, 3788, 3787, + 3085, 15, 3475, 1598, 3329, 1599, 1597, 40, 3289, 3225, + 2953, 3954, 40, 4092, 2751, 2707, 3949, 3958, 3959, 3950, + 3961, 4100, 4102, 2706, 3963, 3964, 2704, 2700, 2699, 46, + 2652, 2399, 4115, 3960, 46, 3962, 2396, 2038, 833, 1611, + 1610, 1620, 1621, 1622, 1623, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 1612, 4130, 1758, 1436, 2232, 3311, 1420, 833, + 3313, 833, 2585, 4041, 5462, 3312, 4926, 1436, 4957, 4958, + 1436, 2890, 3399, 3400, 5444, 4654, 5442, 5423, 4624, 3393, + 2106, 5392, 3040, 5358, 4162, 3040, 5348, 5287, 4165, 5257, + 4166, 5255, 4060, 1598, 4046, 1599, 1597, 4045, 4652, 4152, + 1850, 3055, 1598, 4175, 1599, 1597, 1398, 1394, 1395, 1396, + 1397, 4939, 4643, 3398, 4030, 3397, 3396, 3394, 4642, 1419, + 4138, 5224, 5126, 4031, 4719, 1598, 5120, 1599, 1597, 5111, + 4126, 5109, 3714, 3392, 5091, 5082, 5047, 5046, 3720, 1598, + 5037, 1599, 1597, 5036, 4168, 1598, 5012, 1599, 1597, 3139, + 4119, 5011, 4962, 1436, 4946, 4944, 4209, 3630, 4209, 4213, + 1987, 4213, 4213, 3379, 4930, 3380, 4894, 4129, 4782, 4781, + 4780, 1992, 1993, 1994, 1995, 1996, 1997, 1436, 4723, 1991, + 2002, 2003, 4103, 2008, 4712, 4697, 2012, 2011, 4696, 4641, + 4248, 4694, 4687, 1286, 4557, 3633, 2004, 4685, 4664, 1906, + 1906, 3395, 4356, 4663, 4662, 4241, 4346, 4161, 4658, 2366, + 4657, 2106, 4628, 4207, 3600, 4164, 1598, 4626, 1599, 1597, + 4622, 1598, 4023, 1599, 1597, 4173, 4620, 3982, 4598, 1598, + 4594, 1599, 1597, 1598, 4588, 1599, 1597, 4125, 3829, 4429, + 4418, 4401, 4249, 4250, 4383, 4354, 4206, 833, 4351, 1598, + 4319, 1599, 1597, 4276, 1598, 4143, 1599, 1597, 4221, 4223, + 4144, 4100, 3975, 4146, 4275, 4157, 4272, 1906, 4160, 4155, + 4243, 3043, 4163, 2455, 3974, 4271, 4258, 4253, 1288, 1864, + 4252, 4170, 2585, 2585, 4174, 5033, 4189, 3971, 4123, 1598, + 4191, 1599, 1597, 4194, 3449, 4086, 4078, 4208, 4068, 4210, + 4058, 1598, 3447, 1599, 1597, 4049, 4047, 3406, 2958, 3947, + 4273, 4242, 3944, 3918, 1598, 4306, 1599, 1597, 3897, 3874, + 3837, 1598, 3834, 1599, 1597, 4196, 4198, 3107, 3106, 1598, + 3831, 1599, 1597, 3818, 3446, 3810, 4214, 4215, 3444, 1611, + 1610, 1620, 1621, 1622, 1623, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 1612, 4246, 3800, 3798, 3778, 3779, 3794, 3443, + 924, 1598, 3793, 1599, 1597, 1598, 833, 1599, 1597, 3792, + 3694, 4216, 3795, 3796, 3518, 3500, 3488, 3442, 3476, 1091, + 1090, 4286, 5488, 3441, 4290, 3306, 1598, 4344, 1599, 1597, + 3295, 4262, 4254, 3440, 3255, 2986, 2973, 3642, 4347, 2972, + 2821, 2711, 3439, 4830, 1598, 3840, 1599, 1597, 1888, 2710, + 1598, 3846, 1599, 1597, 2702, 2433, 2398, 2395, 2381, 4259, + 1598, 4159, 1599, 1597, 3438, 2380, 2132, 4268, 4274, 1598, + 4267, 1599, 1597, 1686, 4284, 4285, 1682, 1681, 4278, 1424, + 4326, 4270, 1167, 4328, 4329, 4316, 5436, 5434, 5417, 5282, + 4331, 1598, 5166, 1599, 1597, 4282, 4322, 1611, 1610, 1620, + 1621, 1622, 1623, 1613, 1614, 1615, 1616, 1617, 1618, 1619, + 1612, 3482, 4386, 5416, 5415, 3437, 3482, 4388, 5092, 2680, + 3434, 4936, 4925, 4327, 4924, 4197, 4912, 4906, 4695, 3433, + 4661, 4402, 4647, 4404, 4636, 4589, 3432, 4478, 4410, 5414, + 3714, 3720, 1598, 3426, 1599, 1597, 4466, 1598, 4464, 1599, + 1597, 4457, 1436, 3411, 1290, 79, 1598, 4379, 1599, 1597, + 4333, 3405, 4398, 1598, 79, 1599, 1597, 4377, 4332, 3382, + 1598, 4374, 1599, 1597, 4373, 2938, 4370, 4411, 833, 2585, + 1598, 4361, 1599, 1597, 4363, 4369, 3533, 4357, 1598, 4355, + 1599, 1597, 4456, 4339, 2937, 4353, 1598, 2736, 1599, 1597, + 2931, 4350, 1598, 4462, 1599, 1597, 4308, 4307, 2900, 4422, + 4375, 3532, 2899, 4297, 4405, 4291, 4407, 4426, 4427, 4428, + 2234, 1598, 4182, 1599, 1597, 2288, 2287, 1598, 4169, 1599, + 1597, 2498, 1850, 4484, 4090, 1598, 4393, 1599, 1597, 1598, + 2473, 1599, 1597, 850, 206, 252, 4495, 1598, 4087, 1599, + 1597, 3714, 4040, 3337, 3720, 3978, 4506, 3965, 3957, 1436, + 3956, 3953, 4512, 4459, 4492, 1436, 1600, 4384, 3709, 3284, + 4445, 4380, 3280, 3279, 1636, 4390, 3278, 4209, 4463, 3242, + 4385, 2342, 4262, 3241, 1647, 4387, 2911, 2904, 3026, 2894, + 252, 205, 239, 207, 2893, 2892, 4413, 2891, 4412, 4513, + 4424, 4417, 4421, 2889, 4454, 1436, 1436, 2885, 4583, 2884, + 1657, 4321, 1906, 3027, 252, 4569, 4570, 4571, 4572, 4376, + 245, 4183, 2882, 4442, 2873, 2869, 2868, 4592, 1148, 2782, + 4485, 4444, 2709, 208, 2353, 252, 205, 239, 207, 4581, + 3761, 2351, 833, 4479, 2585, 2350, 4486, 2349, 1850, 1436, + 2348, 2302, 3731, 2301, 2292, 4585, 1927, 4483, 5504, 4610, + 5502, 4491, 5460, 4548, 270, 245, 5458, 3730, 5435, 5424, + 5354, 5353, 5352, 5328, 5321, 5319, 4541, 5217, 5170, 1676, + 5165, 5076, 4482, 3866, 5075, 5074, 5045, 5020, 5014, 245, + 4832, 4630, 4823, 4801, 4795, 4769, 4753, 4500, 4503, 4508, + 4502, 4606, 4567, 4564, 4562, 4555, 4554, 4551, 4550, 79, + 245, 4549, 4450, 4400, 4396, 4352, 4185, 4179, 4556, 2007, + 2010, 4602, 1982, 2001, 79, 1998, 79, 1984, 4574, 1979, + 4083, 4599, 4080, 4079, 4005, 3966, 3832, 3826, 3743, 4580, + 4582, 1148, 3659, 3653, 3649, 1836, 3472, 3252, 1746, 4587, + 3227, 3182, 3068, 3049, 2998, 1154, 2997, 2473, 2952, 4593, + 4677, 2842, 2209, 245, 4683, 1672, 2724, 4597, 4590, 2507, + 4689, 2467, 2377, 4603, 2146, 4633, 4604, 4601, 1999, 4605, + 1757, 1736, 1731, 1730, 4629, 4595, 4679, 4600, 1729, 1728, + 1727, 1726, 1725, 4649, 3642, 3642, 3642, 1724, 4145, 1723, + 1722, 1721, 1720, 16, 4625, 4627, 1719, 1718, 1717, 1716, + 1715, 1436, 1906, 1906, 4615, 4646, 4724, 1714, 4648, 1436, + 1713, 1712, 4651, 1711, 4653, 1710, 1709, 1708, 34, 1707, + 4655, 1706, 1705, 4644, 1704, 1703, 4645, 1436, 1702, 1701, + 3642, 4755, 1700, 4699, 1699, 2246, 1698, 4686, 1697, 4688, + 1696, 4765, 1695, 1694, 1693, 4721, 4659, 4754, 1692, 1689, + 1688, 1687, 1685, 1684, 1683, 1680, 1673, 1670, 4667, 1669, + 1436, 3866, 1668, 1667, 1666, 1665, 1436, 1664, 4673, 1663, + 4720, 4726, 1662, 4730, 1661, 1660, 1659, 1020, 177, 1906, + 1658, 1652, 4730, 1651, 1650, 1649, 4759, 177, 4722, 4680, + 1648, 1561, 1513, 1421, 4700, 5184, 4703, 1960, 833, 5182, + 1436, 1436, 1436, 17, 5180, 1436, 1436, 3686, 3687, 4713, + 5177, 4552, 2769, 1436, 3015, 1436, 1465, 4736, 4732, 5506, + 5505, 4727, 4745, 4826, 4746, 4733, 4738, 4743, 4728, 4757, + 4758, 5461, 5371, 5369, 2246, 2246, 2246, 5306, 4825, 2246, + 2246, 4829, 4871, 4831, 4761, 4486, 4265, 2170, 4820, 2170, + 2729, 3838, 3617, 4206, 4867, 3247, 3032, 826, 4770, 4775, + 4772, 15, 4771, 4548, 4783, 4776, 177, 4889, 4890, 4805, + 4806, 4807, 40, 1560, 4821, 4822, 4541, 1480, 3080, 3066, + 3698, 3078, 3073, 3079, 1906, 3699, 1906, 3074, 1906, 4885, + 3065, 3071, 3069, 84, 46, 3697, 3072, 3070, 3696, 3695, + 4561, 3692, 4563, 1620, 1621, 1622, 1623, 1613, 1614, 1615, + 1616, 1617, 1618, 1619, 1612, 3077, 4927, 4928, 4187, 833, + 3064, 4879, 5237, 5095, 5094, 5067, 4920, 4902, 4188, 4904, + 1511, 4905, 4607, 4940, 4878, 4942, 4881, 5496, 5492, 4774, + 1847, 4475, 3911, 3662, 1820, 2452, 2453, 2447, 2448, 2449, + 4880, 1149, 3774, 4121, 4461, 3149, 3096, 4896, 4295, 4296, + 3775, 3776, 3777, 4293, 4203, 4656, 4204, 2099, 4015, 4575, + 3879, 4425, 2566, 824, 4943, 4901, 4945, 3098, 3097, 4186, + 1975, 3657, 4294, 4608, 1157, 2024, 4975, 3239, 3240, 5215, + 1825, 5285, 3367, 2120, 2980, 2979, 4911, 2020, 1241, 4913, + 2988, 2024, 2987, 2670, 2578, 1555, 4923, 4921, 5017, 4922, + 4971, 1961, 4693, 4139, 4765, 4765, 4095, 4094, 4897, 4994, + 4998, 4948, 4093, 1287, 3724, 3309, 3100, 4949, 831, 4986, + 5286, 3023, 177, 2471, 2423, 2288, 2287, 1755, 1756, 5384, + 4828, 4970, 4967, 1753, 1754, 4973, 5355, 177, 3642, 177, + 1751, 1752, 1749, 1750, 4961, 5016, 4637, 4635, 4251, 4988, + 3209, 4974, 3201, 3196, 1149, 3095, 2589, 1544, 1543, 4734, + 1588, 3913, 2733, 4633, 1436, 4978, 2221, 2177, 2178, 2179, + 2180, 4976, 4987, 1436, 1512, 1157, 5335, 3704, 2989, 4992, + 4993, 2086, 1489, 4989, 1611, 1610, 1620, 1621, 1622, 1623, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1612, 2246, 1488, + 1471, 5031, 1157, 1512, 2753, 4705, 5333, 2170, 3365, 5266, + 1906, 5015, 5234, 5064, 4704, 2236, 5233, 3364, 5231, 2240, + 2241, 2242, 2243, 5130, 5070, 5077, 2232, 1636, 4827, 4650, + 2282, 4621, 4613, 5026, 4498, 4497, 1231, 4315, 4314, 2293, + 5027, 1159, 1160, 1161, 1162, 1740, 1285, 3134, 3121, 1926, + 4612, 4300, 3986, 5061, 3445, 4684, 4451, 4452, 4453, 1486, + 1157, 5373, 5372, 5278, 5279, 5373, 4403, 2321, 2322, 4389, + 5065, 5066, 850, 850, 5110, 850, 4366, 3934, 3495, 5103, + 3494, 3486, 5115, 3485, 1329, 3260, 3256, 2871, 2176, 1461, + 3979, 5122, 4779, 1430, 5372, 2352, 4797, 2354, 2355, 2356, + 2357, 2358, 2232, 5357, 5356, 5339, 5275, 2367, 5078, 5273, + 5271, 3515, 831, 1159, 1160, 1161, 1162, 3513, 1285, 4702, + 2948, 5097, 2015, 5117, 1285, 5118, 5511, 5101, 1159, 1160, + 1161, 1162, 5485, 5486, 5079, 5510, 5284, 4834, 5359, 5157, + 2220, 4365, 827, 4866, 1611, 1610, 1620, 1621, 1622, 1623, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1612, 1504, 93, + 2, 1436, 5107, 5108, 5397, 5160, 5398, 5125, 5119, 1, + 4033, 2950, 2375, 1747, 1158, 5131, 1882, 3219, 5132, 5191, + 5141, 2636, 1910, 5134, 2379, 1164, 1436, 3086, 3087, 5176, + 5178, 5179, 5181, 5183, 3703, 2246, 5147, 2460, 5155, 5150, + 5151, 3089, 2653, 1906, 5213, 1511, 5159, 1466, 3642, 3501, + 2808, 3855, 3194, 5168, 5198, 3003, 4114, 5221, 1837, 1237, + 2170, 2294, 1452, 2053, 1451, 1449, 2237, 2315, 1022, 3035, + 5175, 3827, 3801, 4494, 5383, 5437, 5327, 5386, 2715, 2080, + 5218, 5219, 1006, 5225, 5222, 4317, 5212, 3906, 5083, 5331, + 5085, 4900, 2813, 1593, 4156, 883, 1068, 5256, 1034, 2719, + 3988, 5243, 3983, 1033, 4439, 3606, 2367, 5071, 4979, 884, + 2696, 2367, 2367, 5080, 1906, 5223, 4898, 5230, 1976, 1981, + 5228, 3099, 5000, 5161, 4773, 4199, 3748, 5249, 5251, 2014, + 5186, 5253, 4565, 4916, 4998, 4914, 4915, 2644, 4012, 5258, + 5068, 4882, 931, 5254, 5290, 5250, 5252, 2615, 791, 4824, + 1906, 3030, 5263, 5127, 5019, 1207, 4419, 5268, 3013, 5267, + 5264, 5265, 5269, 1199, 3628, 1853, 1854, 3627, 1856, 2188, + 1602, 1860, 2207, 1869, 4358, 1871, 1872, 2687, 5277, 4359, + 2690, 5283, 1646, 2693, 976, 2853, 2695, 3603, 4535, 3873, + 92, 91, 90, 5298, 278, 5070, 3972, 1025, 277, 4937, + 4717, 5220, 5311, 1003, 1002, 5312, 1001, 5313, 1000, 5314, + 999, 5315, 998, 2481, 2480, 1934, 1935, 2482, 2479, 1938, + 1939, 1940, 1941, 1942, 2477, 1944, 1945, 1946, 2476, 1948, + 1844, 1843, 1952, 4299, 1954, 1955, 1956, 5318, 5334, 4611, + 5336, 5337, 3258, 3259, 5326, 3764, 4576, 1436, 5332, 5330, + 1611, 1610, 1620, 1621, 1622, 1623, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 1612, 3759, 2518, 2514, 5345, 1873, 5346, + 2515, 3124, 3136, 2513, 5303, 4341, 5347, 4638, 5172, 5173, + 4794, 5349, 3811, 5351, 4632, 2446, 3131, 2534, 3781, 2531, + 2530, 3773, 3642, 4790, 4784, 2563, 5137, 5407, 5272, 5410, + 4013, 5274, 4742, 4741, 5362, 5363, 5382, 5361, 5366, 2299, + 5402, 5270, 4740, 5389, 5381, 5370, 5368, 4505, 3719, 5374, + 5375, 5376, 5377, 4739, 5378, 4729, 4516, 4517, 4524, 1379, + 3022, 1436, 1348, 5405, 5405, 5405, 1436, 1343, 1345, 5409, + 5412, 1346, 5393, 5243, 5396, 177, 177, 1344, 177, 1287, + 3378, 3390, 4280, 5401, 4869, 3104, 5413, 4133, 826, 5400, + 3524, 5427, 5160, 3523, 5426, 2170, 3521, 5439, 3520, 1797, + 3866, 5433, 5121, 5259, 1611, 1610, 1620, 1621, 1622, 1623, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1612, 4698, 3531, + 3529, 1470, 2147, 2564, 2143, 5457, 5446, 5457, 1546, 1418, + 3045, 4061, 1763, 1761, 3693, 4998, 3067, 79, 5459, 2642, + 3878, 1845, 5463, 1842, 4180, 1841, 1317, 1316, 2647, 1289, + 246, 1921, 2299, 247, 176, 1146, 5389, 4394, 5467, 5405, + 5473, 2566, 5405, 5473, 4460, 5405, 5473, 5409, 5470, 5476, + 5412, 5475, 5478, 5477, 5471, 3857, 2851, 3210, 3310, 3713, + 2856, 5439, 5489, 4951, 2451, 1201, 3011, 128, 2865, 50, + 149, 5493, 5494, 127, 5482, 224, 5484, 5499, 5501, 71, + 223, 70, 20, 147, 222, 69, 55, 5006, 54, 220, + 123, 122, 121, 120, 5508, 146, 219, 2541, 1423, 68, + 262, 1635, 261, 264, 263, 260, 3269, 2874, 1231, 3270, + 259, 1964, 258, 1431, 5235, 2881, 4737, 5320, 5507, 53, + 5509, 52, 225, 51, 4977, 129, 850, 72, 49, 48, + 850, 850, 2752, 4081, 2085, 4414, 3516, 2994, 47, 42, + 14, 12, 45, 43, 25, 2902, 850, 24, 2059, 23, + 2907, 2908, 2909, 33, 32, 2912, 2913, 2914, 2915, 2916, + 2917, 2918, 2919, 13, 2921, 2922, 41, 2924, 2925, 39, + 38, 943, 942, 949, 939, 168, 167, 37, 2557, 166, + 165, 164, 163, 162, 946, 947, 161, 948, 952, 160, + 36, 933, 22, 63, 62, 61, 60, 59, 58, 1548, + 1550, 957, 1611, 1610, 1620, 1621, 1622, 1623, 1613, 1614, + 1615, 1616, 1617, 1618, 1619, 1612, 5034, 5035, 8, 4488, + 143, 154, 153, 5039, 5040, 5041, 5042, 5043, 5044, 155, + 150, 145, 5048, 5049, 5050, 5051, 5052, 5053, 142, 35, + 144, 140, 141, 5056, 5057, 5058, 132, 131, 130, 2872, + 5062, 1595, 1611, 1610, 1620, 1621, 1622, 1623, 1613, 1614, + 1615, 1616, 1617, 1618, 1619, 1612, 1149, 2564, 124, 104, + 103, 102, 117, 116, 1743, 115, 114, 2545, 113, 112, + 110, 111, 882, 101, 100, 99, 98, 97, 2551, 137, + 136, 133, 119, 126, 125, 4543, 108, 118, 109, 107, + 106, 4522, 105, 96, 95, 2566, 94, 4873, 2539, 2573, + 28, 152, 2540, 2542, 2544, 227, 2546, 2547, 2548, 2552, + 2553, 2554, 2556, 2559, 2560, 2561, 29, 194, 3093, 135, + 134, 151, 226, 2549, 2558, 2550, 73, 203, 202, 201, + 200, 199, 197, 4536, 198, 196, 195, 193, 192, 191, + 190, 64, 65, 66, 5133, 67, 215, 4525, 214, 1848, + 216, 2541, 229, 228, 218, 221, 217, 212, 4519, 210, + 213, 211, 209, 4545, 4546, 85, 11, 148, 21, 4520, + 18, 3, 5156, 5498, 5500, 5418, 0, 2565, 0, 0, + 0, 0, 0, 0, 0, 0, 5169, 0, 1915, 0, + 0, 1924, 0, 0, 0, 0, 0, 0, 826, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4521, 0, + 4528, 0, 0, 0, 934, 936, 935, 0, 0, 0, + 2367, 0, 2367, 0, 0, 0, 941, 0, 4972, 0, + 0, 0, 2557, 0, 0, 0, 0, 0, 945, 0, + 177, 2367, 2367, 0, 0, 960, 0, 2562, 0, 0, + 0, 3375, 938, 0, 0, 0, 0, 2658, 2659, 0, + 0, 0, 0, 0, 2665, 2537, 0, 0, 0, 2536, + 0, 0, 2671, 0, 2673, 1611, 1610, 1620, 1621, 1622, + 1623, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1612, 1960, + 0, 0, 0, 2555, 0, 0, 0, 0, 0, 1231, + 1231, 1832, 2543, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1855, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1875, 0, 0, + 0, 2545, 4544, 0, 3114, 0, 0, 0, 0, 0, + 0, 3315, 2551, 3318, 0, 0, 0, 0, 1912, 177, + 2725, 0, 0, 177, 177, 0, 0, 0, 0, 4532, + 0, 0, 2539, 2573, 0, 0, 2540, 2542, 2544, 177, + 2546, 2547, 2548, 2552, 2553, 2554, 2556, 2559, 2560, 2561, + 0, 4529, 4533, 4531, 4530, 0, 0, 2549, 2558, 2550, + 0, 3345, 3346, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 940, 944, 950, + 0, 951, 953, 0, 0, 954, 955, 956, 0, 0, + 0, 958, 959, 0, 0, 2846, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1372, 0, 0, 4539, + 4540, 2565, 79, 0, 0, 79, 79, 0, 79, 1611, + 1610, 1620, 1621, 1622, 1623, 1613, 1614, 1615, 1616, 1617, + 1618, 1619, 1612, 0, 0, 0, 3384, 0, 0, 3388, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3408, 3409, 0, 0, 0, 0, 0, 0, 0, + 3412, 3413, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3418, 3419, 3420, 0, + 0, 2562, 4547, 0, 850, 850, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4523, 850, 0, 4538, 2537, + 0, 0, 0, 2536, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3456, 0, 3458, 0, 0, + 3461, 850, 2177, 0, 0, 2367, 0, 2555, 0, 0, + 0, 0, 0, 0, 1635, 0, 2543, 0, 2229, 2230, + 0, 0, 2538, 1390, 1391, 1352, 0, 937, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1380, 1384, 1386, 1388, + 1393, 0, 1398, 1394, 1395, 1396, 1397, 0, 0, 1375, + 1376, 1377, 1378, 3387, 1351, 1381, 2142, 1353, 0, 1354, + 1356, 1357, 1358, 1359, 1355, 1360, 1361, 1362, 1363, 1364, + 1371, 1373, 1365, 1366, 1367, 1368, 1369, 1370, 1399, 1400, + 1401, 1402, 1403, 1404, 1405, 1406, 1408, 1407, 1409, 1410, + 1411, 1412, 1413, 1414, 1415, 1416, 1383, 1385, 1387, 1389, + 1392, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 206, 252, 205, 239, 207, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2071, 0, 1374, 0, 0, + 0, 0, 232, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2564, 0, 0, 177, + 0, 2524, 0, 0, 2572, 0, 177, 0, 0, 0, + 0, 4537, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 245, 0, 0, 2501, 1091, 4542, 2060, 0, 0, + 0, 0, 0, 0, 2566, 2533, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2567, 2568, 0, 0, 0, + 0, 0, 0, 0, 1848, 0, 0, 0, 0, 0, + 0, 0, 0, 4526, 4527, 0, 0, 0, 0, 0, + 0, 2532, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2564, 0, 0, + 2541, 0, 2524, 0, 0, 2572, 0, 0, 2367, 0, + 0, 0, 0, 0, 0, 0, 2538, 0, 0, 2651, + 0, 0, 0, 0, 0, 0, 0, 0, 2644, 2404, + 2405, 2406, 0, 0, 0, 2566, 2533, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2567, 2568, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 177, 177, + 0, 177, 0, 3891, 0, 3893, 0, 2445, 0, 0, + 0, 0, 2532, 0, 0, 0, 2459, 0, 0, 0, + 0, 2557, 0, 0, 0, 0, 0, 0, 0, 0, + 1960, 2541, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2511, 2512, 0, 0, 0, 204, + 237, 249, 238, 0, 156, 177, 0, 0, 0, 253, + 0, 2596, 0, 0, 0, 0, 0, 177, 177, 0, + 0, 0, 0, 2077, 231, 230, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 2520, + 2525, 2523, 2557, 0, 0, 2517, 3952, 0, 0, 0, + 2545, 0, 0, 0, 0, 0, 0, 0, 0, 1550, + 0, 2551, 0, 0, 0, 1550, 0, 0, 0, 2535, + 0, 2519, 0, 0, 0, 3976, 0, 1382, 0, 0, + 0, 2539, 2573, 0, 0, 2540, 2542, 2544, 0, 2546, + 2547, 2548, 2552, 2553, 2554, 2556, 2559, 2560, 2561, 0, + 0, 0, 0, 0, 0, 0, 2549, 2558, 2550, 0, + 0, 4010, 0, 0, 0, 0, 0, 0, 2527, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3727, 3728, 2523, 0, 0, 0, 3726, 0, 0, 0, + 0, 2545, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2551, 0, 0, 0, 0, 0, 0, 0, + 2565, 0, 0, 0, 0, 0, 0, 1635, 0, 0, + 0, 0, 2539, 2573, 0, 0, 2540, 2542, 2544, 0, + 2546, 2547, 2548, 2552, 2553, 2554, 2556, 2559, 2560, 2561, + 0, 0, 0, 0, 2564, 0, 0, 2549, 2558, 2550, + 0, 0, 206, 252, 0, 0, 0, 0, 0, 2527, + 0, 79, 2521, 2522, 0, 0, 0, 0, 0, 0, + 0, 2271, 0, 0, 0, 0, 0, 1347, 0, 0, + 2562, 0, 2566, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2537, 0, + 0, 2565, 2536, 3643, 0, 0, 0, 0, 0, 2792, + 2793, 0, 0, 850, 850, 1548, 850, 850, 0, 2796, + 0, 2564, 0, 850, 0, 0, 2555, 0, 245, 0, + 0, 0, 0, 0, 0, 2543, 0, 0, 2541, 0, + 0, 0, 0, 0, 0, 0, 81, 0, 0, 2570, + 2569, 0, 0, 2521, 2522, 0, 0, 0, 0, 2566, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2367, 2562, 0, 0, 0, 0, 2367, 2078, 248, 2079, + 0, 4167, 0, 0, 0, 0, 0, 0, 0, 2537, + 0, 0, 0, 2536, 4177, 0, 0, 4178, 0, 0, + 0, 0, 0, 0, 0, 0, 2529, 0, 0, 0, + 0, 0, 0, 0, 0, 2541, 0, 2555, 0, 2557, + 0, 0, 0, 0, 0, 0, 2543, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2570, 2569, 0, 0, 0, 0, 0, 0, 0, 2571, + 1598, 0, 1599, 1597, 4217, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 177, + 0, 0, 0, 1287, 0, 173, 177, 177, 0, 0, + 0, 0, 0, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 0, 0, 0, 0, 0, 2557, 2529, 2267, 0, + 0, 0, 0, 0, 0, 2264, 0, 0, 0, 2266, + 2263, 2265, 2269, 2270, 0, 0, 253, 2268, 2545, 0, + 0, 3644, 0, 0, 0, 0, 0, 0, 0, 2551, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2571, 0, 2271, 4261, 0, 0, 0, 0, 0, 2539, + 2573, 0, 0, 2540, 2542, 2544, 0, 2546, 2547, 2548, + 2552, 2553, 2554, 2556, 2559, 2560, 2561, 0, 0, 0, + 0, 2974, 0, 2976, 2549, 2558, 2550, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2545, 0, 0, 3000, 3001, + 3002, 0, 0, 0, 0, 2538, 2551, 0, 0, 0, + 0, 0, 0, 3019, 3020, 3021, 0, 0, 0, 0, + 0, 0, 0, 0, 79, 0, 2539, 2573, 2565, 0, + 2540, 2542, 2544, 0, 2546, 2547, 2548, 2552, 2553, 2554, + 2556, 2559, 2560, 2561, 0, 0, 0, 0, 0, 0, + 0, 2549, 2558, 2550, 2252, 2253, 2254, 2255, 2256, 2257, + 2258, 2259, 2260, 2261, 2262, 2274, 2275, 2276, 2277, 2278, + 2279, 2272, 2273, 0, 0, 0, 0, 0, 0, 0, + 0, 4345, 0, 0, 0, 0, 0, 0, 0, 1372, + 0, 4348, 4349, 0, 177, 0, 2538, 0, 2562, 0, + 0, 0, 0, 0, 0, 2565, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2537, 0, 0, 0, + 2536, 0, 0, 0, 0, 0, 0, 0, 4362, 0, + 1287, 4364, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2555, 0, 177, 177, 0, 177, + 177, 0, 0, 2543, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2267, + 1875, 0, 0, 0, 0, 2562, 2264, 0, 0, 0, + 2266, 2263, 2265, 2269, 2270, 0, 1313, 0, 2268, 0, + 0, 0, 0, 2537, 4261, 0, 0, 2536, 0, 0, + 0, 0, 0, 0, 0, 0, 1912, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2555, 0, 3645, 0, 0, 1390, 1391, 1352, 0, + 2543, 0, 1341, 0, 0, 0, 1550, 0, 0, 0, + 0, 0, 3254, 79, 0, 0, 0, 0, 79, 1380, + 1384, 1386, 1388, 1393, 0, 1398, 1394, 1395, 1396, 1397, + 0, 0, 1375, 1376, 1377, 1378, 1350, 1351, 1381, 0, + 1353, 1314, 1354, 1356, 1357, 1358, 1359, 1355, 1360, 1361, + 1362, 1363, 1364, 1371, 1373, 1365, 1366, 1367, 1368, 1369, + 1370, 1399, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1408, + 1407, 1409, 1410, 1411, 1412, 1413, 1414, 1415, 1416, 1383, + 1385, 1387, 1389, 1392, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2252, 2253, 2254, 2255, 2256, + 2257, 2258, 2259, 2260, 2261, 2262, 2274, 2275, 2276, 2277, + 2278, 2279, 2272, 2273, 0, 0, 0, 0, 0, 0, + 1374, 0, 0, 0, 0, 206, 252, 205, 239, 207, + 0, 1306, 0, 1298, 1302, 1304, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, + 0, 2367, 232, 0, 0, 0, 241, 0, 0, 1309, + 0, 0, 0, 1301, 0, 0, 0, 0, 0, 208, + 2367, 0, 0, 0, 0, 0, 174, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 159, 0, 2538, 0, 0, 0, 177, 0, 0, + 0, 245, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1307, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 1311, 0, 0, 0, + 0, 0, 0, 1312, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4660, + 0, 1848, 0, 1848, 0, 0, 0, 0, 0, 0, + 2538, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1299, 0, + 0, 184, 185, 0, 186, 187, 0, 0, 0, 188, + 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1308, 0, 0, 0, 0, 0, 0, 3496, + 3497, 3498, 1372, 0, 0, 0, 0, 1221, 0, 0, + 0, 0, 0, 0, 0, 0, 1223, 0, 1224, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1300, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4756, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1657, 0, 0, 0, 1205, 204, + 237, 249, 238, 86, 156, 0, 0, 0, 0, 253, + 0, 0, 1218, 3676, 1213, 0, 0, 0, 0, 0, + 0, 0, 0, 138, 231, 230, 0, 0, 0, 0, + 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 1305, 0, 0, 0, 0, 0, 1848, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 1382, 177, 0, 0, 0, 157, 0, 0, 0, 1390, + 1391, 1352, 0, 1193, 0, 0, 0, 0, 0, 0, + 0, 233, 234, 235, 0, 0, 1295, 0, 0, 0, + 0, 0, 1380, 1384, 1386, 1388, 1393, 0, 1398, 1394, + 1395, 1396, 1397, 4884, 0, 1375, 1376, 1377, 1378, 1350, + 1351, 1381, 0, 1353, 0, 1354, 1356, 1357, 1358, 1359, + 1355, 1360, 1361, 1362, 1363, 1364, 1371, 1373, 1365, 1366, + 1367, 1368, 1369, 1370, 1399, 1400, 1401, 1402, 1403, 1404, + 1405, 1406, 1408, 1407, 1409, 1410, 1411, 1412, 1413, 1414, + 1415, 1416, 1383, 1385, 1387, 1389, 1392, 242, 0, 0, + 0, 0, 0, 1220, 0, 1212, 0, 0, 0, 0, + 0, 0, 0, 0, 1217, 1215, 0, 0, 169, 0, + 0, 0, 236, 0, 170, 0, 0, 0, 0, 0, + 0, 0, 0, 1374, 0, 1206, 0, 1315, 3880, 0, + 0, 1294, 1296, 0, 0, 871, 0, 0, 0, 1297, + 1347, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1310, 0, 0, 0, + 0, 0, 0, 0, 1222, 0, 0, 0, 0, 1211, + 171, 0, 0, 1210, 0, 0, 0, 0, 0, 1198, + 0, 1960, 0, 77, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1204, 0, + 0, 0, 0, 0, 0, 0, 850, 0, 0, 867, + 868, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 914, 0, 5018, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1216, 0, 0, 0, + 1202, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 181, 248, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 74, 0, 0, 0, 0, 0, 0, 1221, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1203, 0, 0, 0, 916, 0, 0, 915, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1287, 0, 177, 0, 0, 0, 0, 0, + 0, 4840, 0, 0, 172, 173, 57, 0, 0, 0, + 0, 0, 75, 900, 0, 4059, 0, 9, 177, 0, + 0, 0, 0, 872, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1219, 0, 0, 1848, 0, 871, + 0, 0, 0, 0, 0, 4861, 0, 0, 0, 0, + 874, 76, 5149, 0, 139, 0, 0, 0, 0, 178, + 179, 0, 0, 180, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3015, 5167, 0, 0, 1197, 0, + 0, 0, 177, 0, 0, 0, 0, 4839, 0, 0, + 0, 0, 0, 1382, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 867, 868, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 914, 0, 0, 896, 0, 898, + 895, 0, 0, 0, 899, 0, 0, 0, 4124, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4140, + 0, 4141, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 894, 0, 0, 0, 0, 0, 0, 0, 0, 1194, + 4263, 0, 866, 1192, 1195, 0, 0, 0, 0, 0, + 0, 1196, 0, 873, 909, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1200, 0, + 916, 0, 0, 915, 0, 905, 5295, 0, 79, 0, + 0, 5299, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1347, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 906, 910, 859, 4840, 0, 0, 0, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 2749, 4836, 177, + 0, 0, 891, 0, 889, 893, 913, 872, 0, 0, + 890, 887, 885, 0, 892, 876, 877, 875, 0, 865, + 878, 879, 880, 881, 860, 0, 0, 911, 4861, 912, + 0, 0, 0, 0, 874, 0, 0, 0, 0, 0, + 907, 908, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1550, 0, 0, + 4839, 0, 0, 5295, 0, 0, 0, 0, 903, 0, + 0, 0, 0, 0, 0, 0, 0, 861, 0, 0, + 0, 0, 0, 0, 0, 0, 897, 0, 0, 4841, + 4842, 0, 0, 886, 0, 0, 0, 0, 0, 0, + 0, 896, 0, 898, 895, 0, 4837, 4838, 899, 4845, + 4844, 4843, 4859, 4860, 4862, 4846, 4847, 4850, 4852, 4851, + 4848, 4849, 4853, 4855, 4856, 4857, 4854, 0, 4858, 0, + 0, 0, 0, 0, 4863, 0, 5295, 0, 0, 0, + 0, 4865, 0, 0, 0, 4864, 0, 0, 0, 0, + 0, 4263, 0, 0, 894, 0, 0, 0, 0, 0, + 0, 177, 177, 177, 0, 0, 866, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4335, 873, 909, 0, + 0, 0, 901, 0, 0, 0, 0, 0, 869, 870, + 0, 0, 858, 862, 0, 0, 0, 0, 0, 905, + 863, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 864, 0, 0, 0, 0, 0, 902, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 906, 910, 0, 0, 1848, + 5491, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4836, 0, 0, 0, 0, 891, 0, 889, 893, + 913, 0, 0, 0, 890, 887, 885, 0, 892, 876, + 877, 875, 0, 865, 878, 879, 880, 881, 860, 0, + 0, 911, 0, 912, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 907, 908, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 903, 0, 0, 0, 0, 0, 0, 0, + 0, 861, 0, 0, 0, 0, 0, 0, 1550, 0, + 897, 0, 4841, 4842, 0, 1848, 0, 886, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4837, + 4838, 177, 4845, 4844, 4843, 4859, 4860, 4862, 4846, 4847, + 4850, 4852, 4851, 4848, 4849, 4853, 4855, 4856, 4857, 4854, + 0, 4858, 0, 0, 0, 0, 0, 4863, 0, 0, + 0, 0, 0, 0, 4865, 0, 0, 0, 4864, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 901, 0, 0, 0, + 0, 0, 869, 870, 0, 0, 858, 862, 0, 0, + 0, 0, 0, 0, 863, 0, 0, 0, 4263, 0, + 0, 0, 0, 0, 0, 864, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1550, 353, 354, 355, 1114, 357, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 206, 252, 1041, + 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 992, 0, 0, 0, 412, 0, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 1638, 699, + 648, 560, 500, 0, 716, 0, 0, 1115, 1125, 0, + 0, 0, 0, 0, 0, 0, 0, 1110, 0, 0, + 0, 0, 0, 983, 0, 0, 1021, 1091, 1090, 1008, + 1018, 0, 0, 383, 276, 643, 770, 645, 644, 1009, + 0, 1010, 1014, 1017, 1013, 1011, 1012, 0, 1105, 0, + 0, 0, 0, 0, 0, 975, 987, 0, 993, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 984, 985, 0, 0, 0, 0, + 1042, 0, 986, 0, 988, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 1037, 1015, 1019, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 1016, 0, + 1040, 1044, 405, 1131, 1038, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 1132, 465, 466, 467, 468, 469, 470, 430, + 1120, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 4804, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, + 1035, 253, 767, 0, 596, 177, 0, 1112, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 1039, 0, + 547, 520, 1128, 0, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 4929, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 1109, 516, 728, 765, 766, 650, 0, 1127, 1104, 1106, + 1107, 1111, 1116, 1117, 1118, 1119, 1121, 1123, 1126, 1130, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 1129, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 1043, + 702, 703, 504, 505, 506, 507, 1113, 729, 388, 621, + 537, 538, 0, 688, 0, 0, 0, 0, 0, 177, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 1138, 1108, 1137, 1139, 1140, 1136, 1141, 1142, 1122, 997, + 0, 1050, 1051, 1134, 1133, 1135, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 1004, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 1098, 1061, 1062, 1063, + 994, 1064, 1058, 1059, 995, 1060, 1099, 1048, 1095, 1096, + 1023, 1053, 1065, 1094, 1066, 1097, 1024, 1100, 1143, 1144, + 1072, 1056, 310, 1145, 1069, 1101, 1093, 1092, 1067, 1049, + 1102, 1103, 1031, 1026, 1070, 1071, 1057, 1078, 1079, 1080, + 1083, 996, 1084, 1085, 1086, 1087, 1088, 1082, 1081, 1045, + 1046, 1047, 1073, 1074, 1076, 1077, 1052, 567, 1027, 1028, + 1029, 1030, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 1089, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 1075, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 1054, 1055, 721, 722, 0, 0, 1124, 498, 653, 0, + 989, 353, 354, 355, 1114, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1041, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 0, 0, 0, 0, 0, + 992, 0, 0, 0, 412, 0, 0, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 1032, 699, 648, 560, + 500, 0, 716, 0, 0, 1115, 1125, 0, 0, 0, + 0, 0, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 983, 0, 0, 1021, 1091, 1090, 1008, 1018, 0, + 0, 383, 276, 643, 770, 645, 644, 1009, 0, 1010, + 1014, 1017, 1013, 1011, 1012, 0, 1105, 0, 0, 0, + 0, 0, 0, 975, 987, 0, 993, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 984, 985, 0, 0, 0, 0, 1042, 0, + 986, 0, 988, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 1037, 1015, 1019, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 1016, 0, 1040, 1044, + 405, 1131, 1038, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 1132, 465, 466, 467, 468, 469, 470, 430, 1120, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 1035, 0, + 767, 0, 596, 0, 0, 1112, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 1039, 0, 547, 520, + 1128, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 2296, 2295, 2297, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 1109, 516, + 728, 765, 766, 650, 0, 1127, 1104, 1106, 1107, 1111, + 1116, 1117, 1118, 1119, 1121, 1123, 1126, 1130, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 1129, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 1043, 702, 703, + 504, 505, 506, 507, 1113, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 1138, 1108, + 1137, 1139, 1140, 1136, 1141, 1142, 1122, 997, 0, 1050, + 1051, 1134, 1133, 1135, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 1004, 359, 657, 482, 536, 419, + 724, 725, 0, 780, 1098, 1061, 1062, 1063, 994, 1064, + 1058, 1059, 995, 1060, 1099, 1048, 1095, 1096, 1023, 1053, + 1065, 1094, 1066, 1097, 1024, 1100, 1143, 1144, 1072, 1056, + 310, 1145, 1069, 1101, 1093, 1092, 1067, 1049, 1102, 1103, + 1031, 1026, 1070, 1071, 1057, 1078, 1079, 1080, 1083, 996, + 1084, 1085, 1086, 1087, 1088, 1082, 1081, 1045, 1046, 1047, + 1073, 1074, 1076, 1077, 1052, 567, 1027, 1028, 1029, 1030, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 1089, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 1075, 778, 779, 776, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 361, 0, 1054, 1055, + 721, 722, 0, 0, 1124, 498, 653, 0, 989, 353, + 354, 355, 1114, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 206, 252, 1041, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 992, 0, + 0, 0, 412, 0, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 1032, 699, 648, 560, 500, 0, + 716, 0, 0, 1115, 1125, 0, 0, 0, 0, 0, + 0, 0, 0, 1110, 0, 0, 0, 0, 0, 983, + 0, 0, 1021, 1091, 1090, 1008, 1018, 0, 0, 383, + 276, 643, 770, 645, 644, 1009, 0, 1010, 1014, 1017, + 1013, 1011, 1012, 0, 1105, 0, 0, 0, 0, 0, + 0, 975, 987, 0, 993, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 984, 985, 0, 0, 0, 0, 1042, 0, 986, 0, + 988, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 1037, 1015, 1019, 0, 0, 0, 0, 368, + 568, 586, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 1016, 0, 1040, 1044, 405, 1131, + 1038, 594, 372, 0, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 1132, 465, + 466, 467, 468, 469, 470, 430, 1120, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 1035, 0, 767, 0, + 596, 0, 0, 1112, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 1039, 0, 547, 520, 1128, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 539, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 1109, 516, 728, 765, + 766, 650, 0, 1127, 1104, 1106, 1107, 1111, 1116, 1117, + 1118, 1119, 1121, 1123, 1126, 1130, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 751, 744, 1129, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 1043, 702, 703, 504, 505, + 506, 507, 1113, 729, 388, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 511, 442, 448, 557, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 490, 680, 708, 1138, 1108, 1137, 1139, + 1140, 1136, 1141, 1142, 1122, 997, 0, 1050, 1051, 1134, + 1133, 1135, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 1004, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 1098, 1061, 1062, 1063, 994, 1064, 1058, 1059, + 995, 1060, 1099, 1048, 1095, 1096, 1023, 1053, 1065, 1094, + 1066, 1097, 1024, 1100, 1143, 1144, 1072, 1056, 310, 1145, + 1069, 1101, 1093, 1092, 1067, 1049, 1102, 1103, 1031, 1026, + 1070, 1071, 1057, 1078, 1079, 1080, 1083, 996, 1084, 1085, + 1086, 1087, 1088, 1082, 1081, 1045, 1046, 1047, 1073, 1074, + 1076, 1077, 1052, 567, 1027, 1028, 1029, 1030, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 1089, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 1075, 778, 779, 776, 486, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 1054, 1055, 721, 722, + 0, 0, 1124, 498, 653, 0, 989, 353, 354, 355, + 1114, 357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1041, 0, 0, 0, 0, 0, 0, + 0, 0, 518, 0, 0, 662, 696, 685, 774, 649, + 0, 0, 0, 0, 0, 0, 992, 0, 0, 0, + 412, 2368, 0, 481, 700, 681, 692, 682, 524, 667, + 668, 669, 676, 424, 670, 807, 672, 641, 673, 642, + 674, 675, 1032, 699, 648, 560, 500, 0, 716, 0, + 0, 1115, 1125, 0, 0, 0, 0, 0, 0, 0, + 0, 1110, 0, 2627, 0, 0, 0, 983, 0, 0, + 1021, 1091, 1090, 1008, 1018, 0, 0, 383, 276, 643, + 770, 645, 644, 1009, 0, 1010, 1014, 1017, 1013, 1011, + 1012, 0, 1105, 0, 0, 0, 0, 0, 0, 975, + 987, 0, 993, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 984, 985, + 0, 0, 0, 0, 1042, 0, 986, 0, 988, 0, + 0, 0, 0, 561, 589, 0, 602, 0, 450, 451, + 2628, 1015, 1019, 0, 0, 0, 0, 368, 568, 586, + 384, 555, 600, 389, 563, 579, 379, 517, 551, 0, + 0, 370, 584, 562, 495, 369, 0, 544, 409, 426, + 406, 515, 1016, 0, 1040, 1044, 405, 1131, 1038, 594, + 372, 0, 593, 514, 487, 580, 585, 496, 489, 0, + 371, 582, 494, 488, 464, 416, 1132, 465, 466, 467, + 468, 469, 470, 430, 1120, 485, 531, 431, 502, 501, + 503, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 0, 0, 0, 0, 0, 624, 625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 762, 1035, 0, 767, 0, 596, 0, + 0, 1112, 0, 0, 0, 566, 0, 0, 471, 0, + 0, 0, 1039, 0, 547, 520, 1128, 0, 0, 545, + 483, 581, 532, 587, 569, 595, 539, 533, 362, 570, + 408, 497, 380, 382, 796, 410, 413, 417, 418, 508, + 509, 526, 554, 573, 574, 575, 407, 394, 546, 395, + 427, 396, 363, 399, 398, 400, 556, 401, 365, 527, + 578, 0, 423, 542, 492, 366, 491, 528, 577, 576, + 381, 604, 611, 612, 704, 0, 617, 810, 811, 812, + 626, 0, 534, 377, 374, 0, 0, 0, 403, 529, + 390, 392, 393, 391, 523, 525, 631, 632, 633, 635, + 636, 637, 638, 0, 0, 0, 0, 639, 705, 723, + 689, 658, 619, 713, 655, 659, 660, 444, 445, 446, + 447, 726, 0, 0, 0, 610, 472, 473, 0, 415, + 414, 493, 367, 0, 0, 461, 443, 535, 373, 411, + 463, 449, 474, 475, 476, 477, 478, 0, 479, 480, + 421, 352, 358, 804, 1109, 516, 728, 765, 766, 650, + 0, 1127, 1104, 1106, 1107, 1111, 1116, 1117, 1118, 1119, + 1121, 1123, 1126, 1130, 803, 0, 706, 720, 808, 719, + 800, 522, 0, 553, 717, 664, 0, 710, 683, 684, + 0, 711, 679, 715, 0, 652, 0, 620, 623, 654, + 741, 742, 743, 364, 622, 745, 746, 747, 748, 749, + 750, 751, 744, 1129, 687, 663, 690, 601, 666, 665, + 0, 0, 701, 1043, 702, 703, 504, 505, 506, 507, + 1113, 729, 388, 621, 537, 538, 0, 688, 0, 0, + 0, 0, 0, 0, 0, 0, 693, 694, 691, 813, + 0, 752, 753, 0, 0, 615, 616, 420, 0, 634, + 428, 387, 521, 422, 599, 452, 0, 627, 695, 628, + 540, 541, 756, 761, 757, 758, 760, 781, 511, 442, + 448, 557, 462, 484, 543, 598, 519, 548, 385, 588, + 559, 490, 680, 708, 1138, 1108, 1137, 1139, 1140, 1136, + 1141, 1142, 1122, 997, 0, 1050, 1051, 1134, 1133, 1135, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 736, 735, 734, 733, 732, 731, 730, 0, + 0, 677, 402, 801, 795, 802, 782, 785, 784, 759, + 1004, 359, 657, 482, 536, 419, 724, 725, 0, 780, + 1098, 1061, 1062, 1063, 994, 1064, 1058, 1059, 995, 1060, + 1099, 1048, 1095, 1096, 1023, 1053, 1065, 1094, 1066, 1097, + 1024, 1100, 1143, 1144, 1072, 1056, 310, 1145, 1069, 1101, + 1093, 1092, 1067, 1049, 1102, 1103, 1031, 1026, 1070, 1071, + 1057, 1078, 1079, 1080, 1083, 996, 1084, 1085, 1086, 1087, + 1088, 1082, 1081, 1045, 1046, 1047, 1073, 1074, 1076, 1077, + 1052, 567, 1027, 1028, 1029, 1030, 0, 0, 605, 606, + 607, 630, 0, 608, 590, 656, 429, 360, 571, 597, + 798, 799, 0, 0, 0, 0, 0, 0, 0, 707, + 718, 754, 755, 0, 768, 769, 771, 773, 1089, 775, + 564, 565, 783, 0, 0, 453, 375, 376, 512, 513, + 550, 0, 454, 455, 456, 460, 457, 458, 459, 1075, + 778, 779, 776, 486, 549, 572, 558, 797, 499, 347, + 794, 348, 349, 350, 351, 0, 805, 646, 647, 806, + 764, 763, 361, 0, 1054, 1055, 721, 722, 0, 0, + 1124, 498, 653, 0, 989, 353, 354, 355, 1114, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1041, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 992, 0, 0, 0, 412, 5490, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 1032, 699, 648, 560, 500, 0, 716, 0, 0, 1115, + 1125, 0, 0, 0, 0, 0, 0, 0, 0, 1110, + 0, 0, 0, 0, 0, 983, 0, 0, 1021, 1091, + 1090, 1008, 1018, 0, 0, 383, 276, 643, 770, 645, + 644, 1009, 0, 1010, 1014, 1017, 1013, 1011, 1012, 0, + 1105, 0, 0, 0, 0, 0, 0, 975, 987, 0, + 993, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 984, 985, 0, 0, + 0, 0, 1042, 0, 986, 0, 988, 0, 0, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 1037, 1015, + 1019, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 1016, 0, 1040, 1044, 405, 1131, 1038, 594, 372, 0, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 1132, 465, 466, 467, 468, 469, + 470, 430, 1120, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 1035, 0, 767, 0, 596, 0, 0, 1112, + 0, 0, 0, 566, 0, 0, 471, 0, 0, 0, + 1039, 0, 547, 520, 1128, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 0, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 0, 479, 480, 421, 352, + 358, 804, 1109, 516, 728, 765, 766, 650, 0, 1127, + 1104, 1106, 1107, 1111, 1116, 1117, 1118, 1119, 1121, 1123, + 1126, 1130, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 1129, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 1043, 702, 703, 504, 505, 506, 507, 1113, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 511, 442, 448, 557, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 490, + 680, 708, 1138, 1108, 1137, 1139, 1140, 1136, 1141, 1142, + 1122, 997, 0, 1050, 1051, 1134, 1133, 1135, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 1004, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 1098, 1061, + 1062, 1063, 994, 1064, 1058, 1059, 995, 1060, 1099, 1048, + 1095, 1096, 1023, 1053, 1065, 1094, 1066, 1097, 1024, 1100, + 1143, 1144, 1072, 1056, 310, 1145, 1069, 1101, 1093, 1092, + 1067, 1049, 1102, 1103, 1031, 1026, 1070, 1071, 1057, 1078, + 1079, 1080, 1083, 996, 1084, 1085, 1086, 1087, 1088, 1082, + 1081, 1045, 1046, 1047, 1073, 1074, 1076, 1077, 1052, 567, + 1027, 1028, 1029, 1030, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 1089, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 1075, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 1054, 1055, 721, 722, 0, 0, 1124, 498, + 653, 0, 989, 353, 354, 355, 1114, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1041, + 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 992, 0, 0, 0, 412, 0, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 1032, 699, + 648, 560, 500, 0, 716, 0, 0, 1115, 1125, 0, + 0, 0, 0, 0, 0, 0, 0, 1110, 0, 0, + 0, 0, 0, 983, 0, 0, 1021, 1091, 1090, 1008, + 1018, 0, 0, 383, 276, 643, 770, 645, 644, 1009, + 0, 1010, 1014, 1017, 1013, 1011, 1012, 0, 1105, 0, + 0, 0, 0, 0, 0, 975, 987, 0, 993, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 984, 985, 0, 0, 0, 0, + 1042, 0, 986, 0, 988, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 1037, 1015, 1019, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 1016, 0, + 1040, 1044, 405, 1131, 1038, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 1132, 465, 466, 467, 468, 469, 470, 430, + 1120, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, + 1035, 0, 767, 0, 596, 0, 0, 1112, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 1039, 0, + 547, 520, 1128, 5296, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 0, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 1109, 516, 728, 765, 766, 650, 0, 1127, 1104, 1106, + 1107, 1111, 1116, 1117, 1118, 1119, 1121, 1123, 1126, 1130, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 1129, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 1043, + 702, 703, 504, 505, 506, 507, 1113, 729, 388, 621, + 537, 538, 0, 688, 0, 0, 0, 0, 0, 0, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 1138, 1108, 1137, 1139, 1140, 1136, 1141, 1142, 1122, 997, + 0, 1050, 1051, 1134, 1133, 1135, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 1004, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 1098, 1061, 1062, 1063, + 994, 1064, 1058, 1059, 995, 1060, 1099, 1048, 1095, 1096, + 1023, 1053, 1065, 1094, 1066, 1097, 1024, 1100, 1143, 1144, + 1072, 1056, 310, 1145, 1069, 1101, 1093, 1092, 1067, 1049, + 1102, 1103, 1031, 1026, 1070, 1071, 1057, 1078, 1079, 1080, + 1083, 996, 1084, 1085, 1086, 1087, 1088, 1082, 1081, 1045, + 1046, 1047, 1073, 1074, 1076, 1077, 1052, 567, 1027, 1028, + 1029, 1030, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 1089, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 1075, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 1054, 1055, 721, 722, 0, 0, 1124, 498, 653, 0, + 989, 353, 354, 355, 1114, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1041, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 0, 0, 0, 0, 0, + 992, 0, 0, 0, 412, 0, 0, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 1032, 699, 648, 560, + 500, 0, 716, 0, 0, 1115, 1125, 0, 0, 0, + 0, 0, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 983, 0, 0, 1021, 1091, 1090, 1008, 1018, 0, + 0, 383, 276, 643, 770, 645, 644, 1009, 0, 1010, + 1014, 1017, 1013, 1011, 1012, 0, 1105, 0, 0, 0, + 0, 0, 0, 975, 987, 0, 993, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 984, 985, 1959, 0, 0, 0, 1042, 0, + 986, 0, 988, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 1037, 1015, 1019, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 1016, 0, 1040, 1044, + 405, 1131, 1038, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 1132, 465, 466, 467, 468, 469, 470, 430, 1120, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 1035, 0, + 767, 0, 596, 0, 0, 1112, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 1039, 0, 547, 520, + 1128, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 1109, 516, + 728, 765, 766, 650, 0, 1127, 1104, 1106, 1107, 1111, + 1116, 1117, 1118, 1119, 1121, 1123, 1126, 1130, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 1129, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 1043, 702, 703, + 504, 505, 506, 507, 1113, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 1138, 1108, + 1137, 1139, 1140, 1136, 1141, 1142, 1122, 997, 0, 1050, + 1051, 1134, 1133, 1135, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 1004, 359, 657, 482, 536, 419, + 724, 725, 0, 780, 1098, 1061, 1062, 1063, 994, 1064, + 1058, 1059, 995, 1060, 1099, 1048, 1095, 1096, 1023, 1053, + 1065, 1094, 1066, 1097, 1024, 1100, 1143, 1144, 1072, 1056, + 310, 1145, 1069, 1101, 1093, 1092, 1067, 1049, 1102, 1103, + 1031, 1026, 1070, 1071, 1057, 1078, 1079, 1080, 1083, 996, + 1084, 1085, 1086, 1087, 1088, 1082, 1081, 1045, 1046, 1047, + 1073, 1074, 1076, 1077, 1052, 567, 1027, 1028, 1029, 1030, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 1089, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 1075, 778, 779, 776, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 361, 0, 1054, 1055, + 721, 722, 0, 0, 1124, 498, 653, 0, 989, 353, + 354, 355, 1114, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1041, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 992, 0, + 0, 0, 412, 2368, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 1032, 699, 648, 560, 500, 0, + 716, 0, 0, 1115, 1125, 0, 0, 0, 0, 0, + 0, 0, 0, 1110, 0, 0, 0, 0, 0, 983, + 0, 0, 1021, 1091, 1090, 1008, 1018, 0, 0, 383, + 276, 643, 770, 645, 644, 1009, 0, 1010, 1014, 1017, + 1013, 1011, 1012, 0, 1105, 0, 0, 0, 0, 0, + 0, 975, 987, 0, 993, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 984, 985, 0, 0, 0, 0, 1042, 0, 986, 0, + 988, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 1037, 1015, 1019, 0, 0, 0, 0, 368, + 568, 586, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 1016, 0, 1040, 1044, 405, 1131, + 1038, 594, 372, 0, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 1132, 465, + 466, 467, 468, 469, 470, 430, 1120, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 1035, 0, 767, 0, + 596, 0, 0, 1112, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 1039, 0, 547, 520, 1128, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 539, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 1109, 516, 728, 765, + 766, 650, 0, 1127, 1104, 1106, 1107, 1111, 1116, 1117, + 1118, 1119, 1121, 1123, 1126, 1130, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 751, 744, 1129, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 1043, 702, 703, 504, 505, + 506, 507, 1113, 729, 388, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 511, 442, 448, 557, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 490, 680, 708, 1138, 1108, 1137, 1139, + 1140, 1136, 1141, 1142, 1122, 997, 0, 1050, 1051, 1134, + 1133, 1135, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 1004, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 1098, 1061, 1062, 1063, 994, 1064, 1058, 1059, + 995, 1060, 1099, 1048, 1095, 1096, 1023, 1053, 1065, 1094, + 1066, 1097, 1024, 1100, 1143, 1144, 1072, 1056, 310, 1145, + 1069, 1101, 1093, 1092, 1067, 1049, 1102, 1103, 1031, 1026, + 1070, 1071, 1057, 1078, 1079, 1080, 1083, 996, 1084, 1085, + 1086, 1087, 1088, 1082, 1081, 1045, 1046, 1047, 1073, 1074, + 1076, 1077, 1052, 567, 1027, 1028, 1029, 1030, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 1089, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 1075, 778, 779, 776, 486, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 1054, 1055, 721, 722, + 0, 0, 1124, 498, 653, 0, 989, 353, 354, 355, + 1114, 357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1041, 0, 0, 2880, 0, 0, 0, + 0, 0, 518, 0, 0, 662, 696, 685, 774, 649, + 0, 0, 0, 0, 0, 0, 992, 0, 0, 0, + 412, 0, 0, 481, 700, 681, 692, 682, 524, 667, + 668, 669, 676, 424, 670, 807, 672, 641, 673, 642, + 674, 675, 1032, 699, 648, 560, 500, 0, 716, 0, + 0, 1115, 1125, 0, 0, 0, 0, 0, 0, 0, + 0, 1110, 0, 0, 0, 0, 0, 983, 0, 0, + 1021, 1091, 1090, 1008, 1018, 0, 0, 383, 276, 643, + 770, 645, 644, 1009, 0, 1010, 1014, 1017, 1013, 1011, + 1012, 0, 1105, 0, 0, 0, 0, 0, 0, 975, + 987, 0, 993, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 984, 985, + 0, 0, 0, 0, 1042, 0, 986, 0, 988, 0, + 0, 0, 0, 561, 589, 0, 602, 0, 450, 451, + 1037, 1015, 1019, 0, 0, 0, 0, 368, 568, 586, + 384, 555, 600, 389, 563, 579, 379, 517, 551, 0, + 0, 370, 584, 562, 495, 369, 0, 544, 409, 426, + 406, 515, 1016, 0, 1040, 1044, 405, 1131, 1038, 594, + 372, 0, 593, 514, 487, 580, 585, 496, 489, 0, + 371, 582, 494, 488, 464, 416, 1132, 465, 466, 467, + 468, 469, 470, 430, 1120, 485, 531, 431, 502, 501, + 503, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 0, 0, 0, 0, 0, 624, 625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 762, 1035, 0, 767, 0, 596, 0, + 0, 1112, 0, 0, 0, 566, 0, 0, 471, 0, + 0, 0, 1039, 0, 547, 520, 1128, 0, 0, 545, + 483, 581, 532, 587, 569, 595, 539, 533, 362, 570, + 408, 497, 380, 382, 796, 410, 413, 417, 418, 508, + 509, 526, 554, 573, 574, 575, 407, 394, 546, 395, + 427, 396, 363, 399, 398, 400, 556, 401, 365, 527, + 578, 0, 423, 542, 492, 366, 491, 528, 577, 576, + 381, 604, 611, 612, 704, 0, 617, 810, 811, 812, + 626, 0, 534, 377, 374, 0, 0, 0, 403, 529, + 390, 392, 393, 391, 523, 525, 631, 632, 633, 635, + 636, 637, 638, 0, 0, 0, 0, 639, 705, 723, + 689, 658, 619, 713, 655, 659, 660, 444, 445, 446, + 447, 726, 0, 0, 0, 610, 472, 473, 0, 415, + 414, 493, 367, 0, 0, 461, 443, 535, 373, 411, + 463, 449, 474, 475, 476, 477, 478, 0, 479, 480, + 421, 352, 358, 804, 1109, 516, 728, 765, 766, 650, + 0, 1127, 1104, 1106, 1107, 1111, 1116, 1117, 1118, 1119, + 1121, 1123, 1126, 1130, 803, 0, 706, 720, 808, 719, + 800, 522, 0, 553, 717, 664, 0, 710, 683, 684, + 0, 711, 679, 715, 0, 652, 0, 620, 623, 654, + 741, 742, 743, 364, 622, 745, 746, 747, 748, 749, + 750, 751, 744, 1129, 687, 663, 690, 601, 666, 665, + 0, 0, 701, 1043, 702, 703, 504, 505, 506, 507, + 1113, 729, 388, 621, 537, 538, 0, 688, 0, 0, + 0, 0, 0, 0, 0, 0, 693, 694, 691, 813, + 0, 752, 753, 0, 0, 615, 616, 420, 0, 634, + 428, 387, 521, 422, 599, 452, 0, 627, 695, 628, + 540, 541, 756, 761, 757, 758, 760, 781, 511, 442, + 448, 557, 462, 484, 543, 598, 519, 548, 385, 588, + 559, 490, 680, 708, 1138, 1108, 1137, 1139, 1140, 1136, + 1141, 1142, 1122, 997, 0, 1050, 1051, 1134, 1133, 1135, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 736, 735, 734, 733, 732, 731, 730, 0, + 0, 677, 402, 801, 795, 802, 782, 785, 784, 759, + 1004, 359, 657, 482, 536, 419, 724, 725, 0, 780, + 1098, 1061, 1062, 1063, 994, 1064, 1058, 1059, 995, 1060, + 1099, 1048, 1095, 1096, 1023, 1053, 1065, 1094, 1066, 1097, + 1024, 1100, 1143, 1144, 1072, 1056, 310, 1145, 1069, 1101, + 1093, 1092, 1067, 1049, 1102, 1103, 1031, 1026, 1070, 1071, + 1057, 1078, 1079, 1080, 1083, 996, 1084, 1085, 1086, 1087, + 1088, 1082, 1081, 1045, 1046, 1047, 1073, 1074, 1076, 1077, + 1052, 567, 1027, 1028, 1029, 1030, 0, 0, 605, 606, + 607, 630, 0, 608, 590, 656, 429, 360, 571, 597, + 798, 799, 0, 0, 0, 0, 0, 0, 0, 707, + 718, 754, 755, 0, 768, 769, 771, 773, 1089, 775, + 564, 565, 783, 0, 0, 453, 375, 376, 512, 513, + 550, 0, 454, 455, 456, 460, 457, 458, 459, 1075, + 778, 779, 776, 486, 549, 572, 558, 797, 499, 347, + 794, 348, 349, 350, 351, 0, 805, 646, 647, 806, + 764, 763, 361, 0, 1054, 1055, 721, 722, 0, 0, + 1124, 498, 653, 0, 989, 353, 354, 355, 1114, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1041, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 992, 0, 0, 0, 412, 0, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 1032, 699, 648, 560, 500, 0, 716, 0, 0, 1115, + 1125, 0, 0, 0, 0, 0, 0, 0, 0, 1110, + 0, 0, 0, 0, 0, 983, 0, 0, 1021, 1091, + 1090, 1008, 1018, 0, 0, 383, 276, 643, 770, 645, + 644, 1009, 0, 1010, 1014, 1017, 1013, 1011, 1012, 0, + 1105, 0, 0, 0, 0, 0, 0, 975, 987, 0, + 993, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 984, 985, 2359, 0, + 0, 0, 1042, 0, 986, 0, 988, 0, 0, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 1037, 1015, + 1019, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 1016, 0, 1040, 1044, 405, 1131, 1038, 594, 372, 0, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 1132, 465, 466, 467, 468, 469, + 470, 430, 1120, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 1035, 0, 767, 0, 596, 0, 0, 1112, + 0, 0, 0, 566, 0, 0, 471, 0, 0, 0, + 1039, 0, 547, 520, 1128, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 0, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 0, 479, 480, 421, 352, + 358, 804, 1109, 516, 728, 765, 766, 650, 0, 1127, + 1104, 1106, 1107, 1111, 1116, 1117, 1118, 1119, 1121, 1123, + 1126, 1130, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 1129, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 1043, 702, 703, 504, 505, 506, 507, 1113, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 511, 442, 448, 557, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 490, + 680, 708, 1138, 1108, 1137, 1139, 1140, 1136, 1141, 1142, + 1122, 997, 0, 1050, 1051, 1134, 1133, 1135, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 1004, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 1098, 1061, + 1062, 1063, 994, 1064, 1058, 1059, 995, 1060, 1099, 1048, + 1095, 1096, 1023, 1053, 1065, 1094, 1066, 1097, 1024, 1100, + 1143, 1144, 1072, 1056, 310, 1145, 1069, 1101, 1093, 1092, + 1067, 1049, 1102, 1103, 1031, 1026, 1070, 1071, 1057, 1078, + 1079, 1080, 1083, 996, 1084, 1085, 1086, 1087, 1088, 1082, + 1081, 1045, 1046, 1047, 1073, 1074, 1076, 1077, 1052, 567, + 1027, 1028, 1029, 1030, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 1089, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 1075, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 1054, 1055, 721, 722, 0, 0, 1124, 498, + 653, 0, 989, 353, 354, 355, 1114, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1041, + 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 992, 0, 0, 0, 412, 0, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 1032, 699, + 648, 560, 500, 0, 716, 0, 0, 1115, 1125, 0, + 0, 0, 0, 0, 0, 0, 0, 1110, 0, 0, + 0, 0, 0, 983, 0, 0, 1021, 1091, 1090, 1008, + 1018, 0, 0, 383, 276, 643, 770, 645, 644, 1009, + 0, 1010, 1014, 1017, 1013, 1011, 1012, 0, 1105, 0, + 0, 0, 0, 0, 0, 975, 987, 0, 993, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 984, 985, 0, 0, 0, 0, + 1042, 0, 986, 0, 988, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 1037, 1015, 1019, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 1016, 0, + 1040, 1044, 405, 1131, 1038, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 1132, 465, 466, 467, 468, 469, 470, 430, + 1120, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, + 1035, 0, 767, 0, 596, 0, 0, 1112, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 1039, 0, + 547, 520, 1128, 0, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 0, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 1109, 516, 728, 765, 766, 650, 0, 1127, 1104, 1106, + 1107, 1111, 1116, 1117, 1118, 1119, 1121, 1123, 1126, 1130, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 1129, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 1043, + 702, 703, 504, 505, 506, 507, 1113, 729, 388, 621, + 537, 538, 0, 688, 0, 0, 0, 0, 0, 0, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 1138, 1108, 1137, 1139, 1140, 1136, 1141, 1142, 1122, 997, + 0, 1050, 1051, 1134, 1133, 1135, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 1004, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 1098, 1061, 1062, 1063, + 994, 1064, 1058, 1059, 995, 1060, 1099, 1048, 1095, 1096, + 1023, 1053, 1065, 1094, 1066, 1097, 1024, 1100, 1143, 1144, + 1072, 1056, 310, 1145, 1069, 1101, 1093, 1092, 1067, 1049, + 1102, 1103, 1031, 1026, 1070, 1071, 1057, 1078, 1079, 1080, + 1083, 996, 1084, 1085, 1086, 1087, 1088, 1082, 1081, 1045, + 1046, 1047, 1073, 1074, 1076, 1077, 1052, 567, 1027, 1028, + 1029, 1030, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 1089, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 1075, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 1054, 1055, 721, 722, 0, 0, 1124, 498, 653, 0, + 989, 353, 354, 355, 1114, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1041, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 0, 0, 0, 0, 0, + 992, 0, 0, 0, 412, 0, 0, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 1032, 699, 648, 560, + 500, 0, 716, 0, 0, 1115, 1125, 0, 0, 0, + 0, 0, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 983, 0, 0, 1021, 1091, 1090, 1008, 1018, 0, + 0, 383, 276, 643, 770, 645, 644, 1009, 0, 1010, + 1014, 1017, 1013, 1011, 1012, 0, 1105, 0, 0, 0, + 0, 0, 0, 975, 987, 0, 993, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 984, 985, 0, 0, 0, 0, 1042, 0, + 986, 0, 988, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 1037, 1015, 1019, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 1016, 0, 1040, 1044, + 405, 1131, 1038, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 1132, 465, 466, 467, 468, 469, 470, 430, 1120, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 1035, 0, + 767, 0, 596, 0, 0, 1112, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 1039, 0, 547, 520, + 1128, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 1109, 516, + 728, 765, 766, 650, 0, 1127, 1104, 1106, 1107, 1111, + 1116, 1117, 1118, 1119, 1121, 1123, 1126, 1130, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 1129, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 1043, 702, 703, + 504, 505, 506, 507, 1113, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 1138, 1108, + 1137, 1139, 1140, 1136, 1141, 1142, 1122, 997, 0, 1050, + 1051, 1134, 1133, 1135, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 1004, 359, 657, 482, 536, 419, + 724, 725, 0, 780, 1098, 1061, 1062, 1063, 994, 1064, + 1058, 1059, 995, 1060, 1099, 1048, 1095, 1096, 1023, 1053, + 1065, 1094, 1066, 1097, 1024, 1100, 1143, 1144, 1072, 1056, + 310, 1145, 1069, 1101, 1093, 1092, 1067, 1049, 1102, 1103, + 1031, 1026, 1070, 1071, 1057, 1078, 1079, 1080, 1083, 996, + 1084, 1085, 1086, 1087, 1088, 1082, 1081, 1045, 1046, 1047, + 1073, 1074, 1076, 1077, 1052, 567, 1027, 1028, 1029, 1030, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 1089, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 4886, 778, 4887, 4888, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 361, 0, 1054, 1055, + 721, 722, 0, 0, 1124, 498, 653, 0, 989, 353, + 354, 355, 1114, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1041, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 992, 0, + 0, 0, 412, 0, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 1032, 699, 648, 560, 500, 0, + 716, 0, 0, 1115, 1125, 0, 0, 0, 0, 0, + 0, 0, 0, 1110, 0, 0, 0, 0, 0, 983, + 0, 0, 1021, 1091, 1090, 1008, 1018, 0, 0, 383, + 276, 643, 770, 645, 644, 3464, 0, 3465, 1014, 1017, + 1013, 1011, 1012, 0, 1105, 0, 0, 0, 0, 0, + 0, 975, 987, 0, 993, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 984, 985, 0, 0, 0, 0, 1042, 0, 986, 0, + 988, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 1037, 1015, 1019, 0, 0, 0, 0, 368, + 568, 586, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 1016, 0, 1040, 1044, 405, 1131, + 1038, 594, 372, 0, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 1132, 465, + 466, 467, 468, 469, 470, 430, 1120, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 1035, 0, 767, 0, + 596, 0, 0, 1112, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 1039, 0, 547, 520, 1128, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 539, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 1109, 516, 728, 765, + 766, 650, 0, 1127, 1104, 1106, 1107, 1111, 1116, 1117, + 1118, 1119, 1121, 1123, 1126, 1130, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 751, 744, 1129, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 1043, 702, 703, 504, 505, + 506, 507, 1113, 729, 388, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 511, 442, 448, 557, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 490, 680, 708, 1138, 1108, 1137, 1139, + 1140, 1136, 1141, 1142, 1122, 997, 0, 1050, 1051, 1134, + 1133, 1135, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 1004, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 1098, 1061, 1062, 1063, 994, 1064, 1058, 1059, + 995, 1060, 1099, 1048, 1095, 1096, 1023, 1053, 1065, 1094, + 1066, 1097, 1024, 1100, 1143, 1144, 1072, 1056, 310, 1145, + 1069, 1101, 1093, 1092, 1067, 1049, 1102, 1103, 1031, 1026, + 1070, 1071, 1057, 1078, 1079, 1080, 1083, 996, 1084, 1085, + 1086, 1087, 1088, 1082, 1081, 1045, 1046, 1047, 1073, 1074, + 1076, 1077, 1052, 567, 1027, 1028, 1029, 1030, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 1089, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 1075, 778, 779, 776, 486, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 1054, 1055, 721, 722, + 0, 0, 1124, 498, 653, 0, 989, 353, 354, 355, + 1114, 357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1041, 0, 0, 0, 0, 0, 0, + 0, 0, 518, 0, 0, 662, 696, 685, 774, 649, + 0, 0, 2189, 0, 0, 0, 992, 0, 0, 0, + 412, 0, 0, 481, 700, 681, 692, 682, 524, 667, + 668, 669, 676, 424, 670, 807, 672, 641, 673, 642, + 674, 675, 1032, 699, 648, 560, 500, 0, 716, 0, + 0, 1115, 1125, 0, 0, 0, 0, 0, 0, 0, + 0, 1110, 0, 0, 0, 0, 0, 983, 0, 0, + 1021, 1091, 1090, 1008, 1018, 0, 0, 383, 276, 643, + 770, 645, 644, 1009, 0, 1010, 1014, 1017, 1013, 1011, + 1012, 0, 1105, 0, 0, 0, 0, 0, 0, 0, + 987, 0, 993, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 984, 985, + 0, 0, 0, 0, 1042, 0, 986, 0, 988, 0, + 0, 0, 0, 561, 589, 0, 602, 0, 450, 451, + 1037, 1015, 1019, 0, 0, 0, 0, 368, 568, 586, + 384, 555, 600, 389, 563, 579, 379, 517, 551, 0, + 0, 370, 584, 562, 495, 369, 0, 544, 409, 426, + 406, 515, 1016, 0, 1040, 1044, 405, 1131, 1038, 594, + 372, 0, 593, 514, 487, 580, 585, 496, 489, 0, + 371, 582, 494, 488, 464, 416, 1132, 465, 466, 467, + 468, 469, 470, 430, 1120, 485, 531, 431, 502, 501, + 503, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 0, 0, 0, 0, 0, 624, 625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 762, 1035, 0, 767, 0, 596, 0, + 0, 1112, 0, 0, 0, 566, 0, 0, 471, 0, + 0, 0, 1039, 0, 547, 520, 1128, 0, 0, 545, + 483, 581, 532, 587, 569, 595, 539, 533, 362, 570, + 408, 497, 380, 382, 796, 410, 413, 417, 418, 508, + 509, 526, 554, 573, 574, 575, 407, 394, 546, 395, + 427, 396, 363, 399, 398, 400, 556, 401, 365, 527, + 578, 0, 423, 542, 492, 366, 491, 528, 577, 576, + 381, 604, 2190, 2191, 704, 0, 617, 810, 811, 812, + 626, 0, 534, 377, 374, 0, 0, 0, 403, 529, + 390, 392, 393, 391, 523, 525, 631, 632, 633, 635, + 636, 637, 638, 0, 0, 0, 0, 639, 705, 723, + 689, 658, 619, 713, 655, 659, 660, 444, 445, 446, + 447, 726, 0, 0, 0, 610, 472, 473, 0, 415, + 414, 493, 367, 0, 0, 461, 443, 535, 373, 411, + 463, 449, 474, 475, 476, 477, 478, 0, 479, 480, + 421, 352, 358, 804, 1109, 516, 728, 765, 766, 650, + 0, 1127, 1104, 1106, 1107, 1111, 1116, 1117, 1118, 1119, + 1121, 1123, 1126, 1130, 803, 0, 706, 720, 808, 719, + 800, 522, 0, 553, 717, 664, 0, 710, 683, 684, + 0, 711, 679, 715, 0, 652, 0, 620, 623, 654, + 741, 742, 743, 364, 622, 745, 746, 747, 748, 749, + 750, 751, 744, 1129, 687, 663, 690, 601, 666, 665, + 0, 0, 701, 1043, 702, 703, 504, 505, 506, 507, + 1113, 729, 388, 621, 537, 538, 0, 688, 0, 0, + 0, 0, 0, 0, 0, 0, 693, 694, 691, 813, + 0, 752, 753, 0, 0, 615, 616, 420, 0, 634, + 428, 387, 521, 422, 599, 452, 0, 627, 695, 628, + 540, 541, 756, 761, 757, 758, 760, 781, 511, 442, + 448, 557, 462, 484, 543, 598, 519, 548, 385, 588, + 559, 490, 680, 708, 1138, 1108, 1137, 1139, 1140, 1136, + 1141, 1142, 1122, 997, 0, 1050, 1051, 1134, 1133, 1135, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 736, 735, 734, 733, 732, 731, 730, 0, + 0, 677, 402, 801, 795, 802, 782, 785, 784, 759, + 1004, 359, 657, 482, 536, 419, 724, 725, 0, 780, + 1098, 1061, 1062, 1063, 994, 1064, 1058, 1059, 995, 1060, + 1099, 1048, 1095, 1096, 1023, 1053, 1065, 1094, 1066, 1097, + 1024, 1100, 1143, 1144, 1072, 1056, 310, 1145, 1069, 1101, + 1093, 1092, 1067, 1049, 1102, 1103, 1031, 1026, 1070, 1071, + 1057, 1078, 1079, 1080, 1083, 996, 1084, 1085, 1086, 1087, + 1088, 1082, 1081, 1045, 1046, 1047, 1073, 1074, 1076, 1077, + 1052, 567, 1027, 1028, 1029, 1030, 0, 0, 605, 606, + 607, 630, 0, 608, 590, 656, 429, 360, 571, 597, + 798, 799, 0, 0, 0, 0, 0, 0, 0, 707, + 718, 754, 755, 0, 768, 769, 771, 773, 1089, 775, + 564, 565, 783, 0, 0, 453, 375, 376, 512, 513, + 550, 0, 454, 455, 456, 460, 457, 458, 459, 1075, + 778, 779, 776, 486, 549, 572, 558, 797, 499, 347, + 794, 348, 349, 350, 351, 0, 805, 646, 647, 806, + 764, 763, 361, 0, 1054, 1055, 721, 722, 0, 0, + 1124, 498, 653, 0, 989, 353, 354, 355, 1114, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1041, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 992, 0, 0, 0, 412, 0, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 1032, 699, 648, 560, 500, 0, 716, 0, 0, 1115, + 1125, 0, 0, 0, 0, 0, 0, 0, 0, 1110, + 0, 0, 0, 0, 0, 1656, 0, 0, 1021, 1091, + 1090, 1008, 1018, 0, 0, 383, 276, 643, 770, 645, + 644, 1009, 0, 1010, 1014, 1017, 1013, 1011, 1012, 0, + 1105, 0, 0, 0, 0, 0, 0, 975, 987, 0, + 993, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 984, 985, 0, 0, + 0, 0, 1042, 0, 986, 0, 988, 0, 0, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 1037, 1015, + 1019, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 1016, 0, 1040, 1044, 405, 1131, 1038, 594, 372, 0, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 1132, 465, 466, 467, 468, 469, + 470, 430, 1120, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 1035, 0, 767, 0, 596, 0, 0, 1112, + 0, 0, 0, 566, 0, 0, 471, 0, 0, 0, + 1039, 0, 547, 520, 1128, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 0, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 0, 479, 480, 421, 352, + 358, 804, 1109, 516, 728, 765, 766, 650, 0, 1127, + 1104, 1106, 1107, 1111, 1116, 1117, 1118, 1119, 1121, 1123, + 1126, 1130, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 1129, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 1043, 702, 703, 504, 505, 506, 507, 1113, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 511, 442, 448, 557, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 490, + 680, 708, 1138, 1108, 1137, 1139, 1140, 1136, 1141, 1142, + 1122, 997, 0, 1050, 1051, 1134, 1133, 1135, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 1004, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 1098, 1061, + 1062, 1063, 994, 1064, 1058, 1059, 995, 1060, 1099, 1048, + 1095, 1096, 1023, 1053, 1065, 1094, 1066, 1097, 1024, 1100, + 1143, 1144, 1072, 1056, 310, 1145, 1069, 1101, 1093, 1092, + 1067, 1049, 1102, 1103, 1031, 1026, 1070, 1071, 1057, 1078, + 1079, 1080, 1083, 996, 1084, 1085, 1086, 1087, 1088, 1082, + 1081, 1045, 1046, 1047, 1073, 1074, 1076, 1077, 1052, 567, + 1027, 1028, 1029, 1030, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 1089, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 1075, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 1054, 1055, 721, 722, 0, 0, 1124, 498, + 653, 0, 989, 353, 354, 355, 1114, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1041, + 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 992, 0, 0, 0, 412, 0, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 1032, 699, + 648, 560, 500, 0, 716, 0, 0, 1115, 1125, 0, + 0, 0, 0, 0, 0, 0, 0, 1110, 0, 0, + 0, 0, 0, 983, 0, 0, 1021, 1091, 1090, 1008, + 1018, 0, 0, 383, 276, 643, 770, 645, 644, 1009, + 0, 1010, 1014, 1017, 1013, 1011, 1012, 0, 1105, 0, + 0, 0, 0, 0, 0, 0, 987, 0, 993, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 984, 985, 0, 0, 0, 0, + 1042, 0, 986, 0, 988, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 1037, 1015, 1019, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 1016, 0, + 1040, 1044, 405, 1131, 1038, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 1132, 465, 466, 467, 468, 469, 470, 430, + 1120, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, + 1035, 0, 767, 0, 596, 0, 0, 1112, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 1039, 0, + 547, 520, 1128, 0, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 0, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 1109, 516, 728, 765, 766, 650, 0, 1127, 1104, 1106, + 1107, 1111, 1116, 1117, 1118, 1119, 1121, 1123, 1126, 1130, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 1129, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 1043, + 702, 703, 504, 505, 506, 507, 1113, 729, 388, 621, + 537, 538, 0, 688, 0, 0, 0, 0, 0, 0, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 1138, 1108, 1137, 1139, 1140, 1136, 1141, 1142, 1122, 997, + 0, 1050, 1051, 1134, 1133, 1135, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 1004, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 1098, 1061, 1062, 1063, + 994, 1064, 1058, 1059, 995, 1060, 1099, 1048, 1095, 1096, + 1023, 1053, 1065, 1094, 1066, 1097, 1024, 1100, 1143, 1144, + 1072, 1056, 310, 1145, 1069, 1101, 1093, 1092, 1067, 1049, + 1102, 1103, 1031, 1026, 1070, 1071, 1057, 1078, 1079, 1080, + 1083, 996, 1084, 1085, 1086, 1087, 1088, 1082, 1081, 1045, + 1046, 1047, 1073, 1074, 1076, 1077, 1052, 567, 1027, 1028, + 1029, 1030, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 1089, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 1075, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 1054, 1055, 721, 722, 0, 0, 1124, 498, 653, 0, + 989, 353, 354, 355, 356, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 206, 252, 205, 239, 207, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 240, 0, 0, 0, 0, + 0, 0, 232, 0, 412, 0, 241, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 671, + 672, 641, 673, 642, 674, 675, 174, 699, 648, 560, + 500, 0, 716, 0, 0, 0, 0, 0, 0, 0, + 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 245, 0, 0, 275, 0, 0, 0, 0, 0, + 0, 383, 276, 643, 770, 645, 644, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 0, 0, 0, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 0, 0, 583, 613, + 405, 603, 0, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 629, 465, 466, 467, 468, 469, 470, 430, 530, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 204, + 237, 249, 238, 86, 156, 0, 0, 762, 0, 253, + 767, 0, 596, 0, 0, 268, 0, 0, 0, 566, + 0, 0, 471, 138, 231, 230, 614, 0, 547, 520, + 281, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 291, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 157, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 738, 739, 740, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 591, 404, 516, + 728, 765, 766, 650, 0, 714, 651, 661, 397, 686, + 698, 697, 510, 609, 271, 709, 712, 640, 283, 0, + 706, 720, 678, 719, 284, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 592, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 618, 702, 703, + 504, 505, 506, 507, 425, 729, 388, 621, 537, 538, + 171, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 280, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 0, 0, + 0, 0, 0, 0, 0, 0, 81, 0, 0, 333, + 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 289, 378, 290, + 782, 785, 784, 759, 0, 359, 657, 482, 536, 419, + 724, 725, 74, 780, 292, 293, 294, 295, 296, 297, + 298, 299, 340, 300, 301, 302, 303, 304, 305, 306, + 311, 312, 313, 314, 315, 316, 317, 318, 727, 309, + 310, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 0, 0, 0, 0, 341, + 786, 787, 788, 789, 790, 0, 0, 342, 343, 344, + 0, 0, 307, 308, 335, 567, 336, 337, 338, 339, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 285, 286, 57, 269, 272, 274, + 273, 0, 75, 707, 718, 754, 755, 9, 768, 769, + 771, 773, 772, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 777, 778, 779, 776, 486, 549, 572, + 558, 279, 499, 347, 282, 348, 349, 350, 351, 178, + 287, 646, 647, 288, 764, 763, 361, 0, 345, 346, + 721, 722, 0, 0, 552, 498, 653, 353, 354, 355, + 356, 357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 206, 252, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 518, 0, 0, 662, 696, 685, 774, 649, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 412, 0, 0, 481, 700, 681, 692, 682, 524, 667, + 668, 669, 676, 424, 670, 807, 672, 641, 673, 642, + 674, 675, 1292, 699, 648, 560, 500, 0, 716, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 245, 0, 0, + 275, 0, 0, 0, 0, 0, 0, 383, 276, 643, + 770, 645, 644, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 386, 3116, 3119, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 561, 589, 0, 602, 0, 450, 451, + 0, 0, 0, 0, 0, 0, 0, 368, 568, 586, + 384, 555, 600, 389, 563, 579, 379, 517, 551, 0, + 0, 370, 584, 562, 495, 369, 0, 544, 409, 426, + 406, 515, 0, 0, 583, 613, 405, 603, 0, 594, + 372, 0, 593, 514, 487, 580, 585, 496, 489, 0, + 371, 582, 494, 488, 464, 416, 629, 465, 466, 467, + 468, 469, 470, 430, 530, 485, 531, 431, 502, 501, + 503, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 0, 0, 0, 0, 0, 624, 625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 762, 0, 253, 767, 3120, 596, 0, + 0, 0, 3115, 0, 3114, 566, 3111, 3117, 471, 0, + 0, 0, 614, 0, 547, 520, 809, 0, 0, 545, + 483, 581, 532, 587, 569, 595, 539, 533, 362, 570, + 408, 497, 380, 382, 796, 410, 413, 417, 418, 508, + 509, 526, 554, 573, 574, 575, 407, 394, 546, 395, + 427, 396, 363, 399, 398, 400, 556, 401, 365, 527, + 578, 3118, 423, 542, 492, 366, 491, 528, 577, 576, + 381, 604, 611, 612, 704, 0, 617, 810, 811, 812, + 626, 0, 534, 377, 374, 0, 0, 0, 403, 529, + 390, 392, 393, 391, 523, 525, 631, 632, 633, 635, + 636, 637, 638, 0, 0, 0, 0, 639, 705, 723, + 689, 658, 619, 713, 655, 659, 660, 444, 445, 446, + 447, 726, 0, 0, 0, 610, 472, 473, 0, 415, + 414, 493, 367, 0, 0, 461, 443, 535, 373, 411, + 463, 449, 474, 475, 476, 477, 478, 3112, 479, 480, + 421, 352, 358, 804, 404, 516, 728, 765, 766, 650, + 0, 714, 651, 661, 397, 686, 698, 697, 510, 609, + 0, 709, 712, 640, 803, 0, 706, 720, 808, 719, + 800, 522, 0, 553, 717, 664, 0, 710, 683, 684, + 0, 711, 679, 715, 0, 652, 0, 620, 623, 654, + 741, 742, 743, 364, 622, 745, 746, 747, 748, 749, + 750, 751, 744, 592, 687, 663, 690, 601, 666, 665, + 0, 0, 701, 618, 702, 703, 504, 505, 506, 507, + 425, 729, 388, 621, 537, 538, 0, 688, 0, 0, + 0, 0, 0, 0, 0, 0, 693, 694, 691, 813, + 0, 752, 753, 0, 0, 615, 616, 420, 0, 634, + 428, 387, 521, 422, 599, 452, 0, 627, 695, 628, + 540, 541, 756, 761, 757, 758, 760, 781, 511, 442, + 448, 557, 462, 484, 543, 598, 519, 548, 385, 588, + 559, 490, 680, 708, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 333, 334, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 736, 735, 734, 733, 732, 731, 730, 0, + 0, 677, 402, 801, 795, 802, 782, 785, 784, 759, + 0, 359, 657, 482, 536, 419, 724, 725, 0, 780, + 292, 293, 294, 295, 296, 297, 298, 299, 340, 300, + 301, 302, 303, 304, 305, 306, 311, 312, 313, 314, + 315, 316, 317, 318, 727, 309, 310, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 0, 0, 0, 0, 341, 786, 787, 788, 789, + 790, 0, 0, 342, 343, 344, 0, 0, 307, 308, + 335, 567, 336, 337, 338, 339, 0, 0, 605, 606, + 607, 630, 0, 608, 590, 656, 429, 360, 571, 597, + 798, 799, 0, 0, 0, 0, 0, 0, 0, 707, + 718, 754, 755, 0, 768, 769, 771, 773, 772, 775, + 564, 565, 783, 0, 0, 453, 375, 376, 512, 513, + 550, 0, 454, 455, 456, 460, 457, 458, 459, 777, + 778, 779, 776, 486, 549, 572, 558, 797, 499, 347, + 794, 348, 349, 350, 351, 0, 805, 646, 647, 806, + 764, 763, 361, 0, 345, 346, 721, 722, 0, 0, + 552, 498, 653, 353, 354, 355, 356, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 206, 252, 205, + 239, 207, 0, 0, 0, 0, 0, 0, 518, 835, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 412, 0, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 0, 699, + 648, 560, 500, 0, 716, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 842, 0, 0, 0, 0, 0, + 0, 0, 0, 841, 0, 0, 275, 0, 0, 0, + 0, 0, 0, 383, 276, 643, 770, 645, 644, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 386, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 0, 0, 0, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 0, 0, + 583, 613, 405, 603, 0, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 629, 465, 466, 467, 468, 469, 470, 430, + 530, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 837, 838, 0, 762, + 0, 253, 767, 0, 596, 0, 0, 0, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 614, 0, + 547, 520, 809, 0, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 0, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 404, 516, 728, 765, 766, 650, 0, 714, 651, 661, + 397, 686, 698, 697, 510, 609, 0, 709, 712, 640, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 592, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 618, + 702, 703, 504, 505, 506, 507, 836, 840, 388, 621, + 537, 538, 851, 688, 0, 0, 0, 0, 0, 0, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, + 0, 333, 334, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 0, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 292, 293, 294, 295, + 296, 297, 298, 299, 340, 300, 301, 302, 303, 304, + 305, 306, 311, 312, 313, 314, 315, 316, 317, 318, + 727, 309, 310, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 0, 0, 0, + 0, 341, 786, 787, 788, 789, 790, 0, 0, 342, + 343, 344, 0, 0, 307, 308, 335, 567, 336, 337, + 338, 339, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 772, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 777, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 345, 346, 721, 722, 0, 0, 552, 498, 653, 353, + 354, 355, 356, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 412, 0, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 0, 699, 648, 560, 500, 0, + 716, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1677, + 0, 0, 275, 0, 0, 1008, 1018, 0, 0, 383, + 276, 643, 770, 645, 644, 1009, 0, 1010, 1014, 1017, + 1013, 1011, 1012, 0, 386, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 0, 1015, 0, 0, 0, 0, 0, 368, + 568, 586, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 1016, 0, 583, 613, 405, 603, + 0, 594, 372, 0, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 629, 465, + 466, 467, 468, 469, 470, 430, 530, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 0, 0, 767, 0, + 596, 0, 0, 0, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 614, 0, 547, 520, 809, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 539, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 404, 516, 728, 765, + 766, 650, 0, 714, 651, 661, 397, 686, 698, 697, + 510, 609, 0, 709, 712, 640, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 751, 744, 592, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 618, 702, 703, 504, 505, + 506, 507, 425, 729, 388, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 511, 442, 448, 557, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 490, 680, 708, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 0, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 292, 293, 294, 295, 296, 297, 298, 299, + 340, 300, 301, 302, 303, 304, 305, 306, 311, 312, + 313, 314, 315, 316, 317, 318, 727, 309, 310, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 0, 0, 0, 0, 341, 786, 787, + 788, 789, 790, 0, 0, 342, 343, 344, 0, 0, + 307, 308, 335, 567, 336, 337, 338, 339, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 772, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 777, 778, 779, 776, 486, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 345, 346, 721, 722, + 0, 0, 552, 498, 653, 353, 354, 355, 356, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 0, 699, 648, 560, 500, 0, 716, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 383, 276, 643, 770, 645, + 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 386, 3116, 3119, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 0, 0, + 0, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 0, 0, 583, 613, 405, 603, 0, 594, 372, 0, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 629, 465, 466, 467, 468, 469, + 470, 430, 530, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 0, 0, 767, 3120, 596, 0, 0, 0, + 3115, 0, 3114, 566, 3111, 3117, 471, 0, 0, 0, + 614, 0, 547, 520, 809, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 3118, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 3112, 479, 480, 421, 352, + 358, 804, 404, 516, 728, 765, 766, 650, 0, 714, + 651, 661, 397, 686, 698, 697, 510, 609, 0, 709, + 712, 640, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 592, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 618, 702, 703, 504, 505, 506, 507, 425, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 511, 442, 448, 557, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 490, + 680, 708, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 333, 334, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 0, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 292, 293, + 294, 295, 296, 297, 298, 299, 340, 300, 301, 302, + 303, 304, 305, 306, 311, 312, 313, 314, 315, 316, + 317, 318, 727, 309, 310, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 0, + 0, 0, 0, 341, 786, 787, 788, 789, 790, 0, + 0, 342, 343, 344, 0, 0, 307, 308, 335, 567, + 336, 337, 338, 339, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 772, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 777, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 345, 346, 721, 722, 0, 0, 552, 498, + 653, 353, 354, 355, 356, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 1372, 0, 0, 0, 0, + 0, 0, 0, 0, 412, 0, 0, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 0, 699, 648, 560, + 500, 0, 716, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, + 0, 383, 276, 643, 770, 645, 644, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 3566, 3567, 1352, 0, 0, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 3560, 3563, 3564, 3565, 3568, + 0, 3573, 3569, 3570, 3571, 3572, 0, 0, 3556, 3557, + 3558, 3559, 1350, 3535, 3561, 0, 3536, 514, 3537, 3538, + 3539, 3540, 3541, 1355, 3542, 3543, 3544, 3545, 3546, 3553, + 3554, 3547, 3548, 3549, 3550, 3551, 3552, 3574, 3575, 3576, + 3577, 3578, 3579, 3580, 3581, 3583, 3582, 3584, 3585, 3586, + 3587, 3588, 3589, 3590, 3591, 1383, 1385, 1387, 1389, 1392, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 0, 0, + 767, 0, 596, 0, 0, 0, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 3555, 0, 547, 520, + 809, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 404, 516, + 728, 765, 766, 650, 0, 714, 651, 661, 397, 686, + 698, 697, 510, 609, 0, 709, 712, 640, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 592, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 618, 702, 703, + 504, 505, 506, 507, 425, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 0, 359, 3562, 482, 536, 419, + 724, 725, 0, 780, 292, 293, 294, 295, 296, 297, + 298, 299, 340, 300, 301, 302, 303, 304, 305, 306, + 311, 312, 313, 314, 315, 316, 317, 318, 727, 309, + 310, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 0, 0, 0, 0, 341, + 786, 787, 788, 789, 790, 0, 0, 342, 343, 344, + 0, 0, 307, 308, 335, 567, 336, 337, 338, 339, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 772, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 777, 778, 779, 776, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 3534, 0, 345, 346, + 721, 722, 0, 0, 552, 498, 653, 1849, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 206, 252, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 1292, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1846, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 253, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 0, 2505, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 3138, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 3137, 596, 0, 0, + 0, 3144, 3140, 3142, 566, 0, 3141, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 3135, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 3143, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 3138, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 3137, 596, 0, 0, 0, 3144, 3140, 3142, + 566, 0, 3141, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 3143, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 206, 252, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 1292, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 245, 3302, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 253, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 206, 252, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 1292, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 245, 3038, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 253, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 1849, 353, 354, 355, 356, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 412, 0, 0, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 0, 699, 648, 560, + 500, 0, 716, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1846, 0, 0, 275, 0, 0, 0, 0, 0, + 0, 383, 276, 643, 770, 645, 644, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 0, 0, 0, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 0, 0, 583, 613, + 405, 603, 0, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 629, 465, 466, 467, 468, 469, 470, 430, 530, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 0, 0, + 767, 0, 596, 0, 0, 0, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 614, 0, 547, 520, + 809, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 404, 516, + 728, 765, 766, 650, 0, 714, 651, 661, 397, 686, + 698, 697, 510, 609, 0, 709, 712, 640, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 592, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 618, 702, 703, + 504, 505, 506, 507, 425, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 0, 359, 657, 482, 536, 419, + 724, 725, 0, 780, 292, 293, 294, 295, 296, 297, + 298, 299, 340, 300, 301, 302, 303, 304, 305, 306, + 311, 312, 313, 314, 315, 316, 317, 318, 727, 309, + 310, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 0, 0, 0, 0, 341, + 786, 787, 788, 789, 790, 0, 0, 342, 343, 344, + 0, 0, 307, 308, 335, 567, 336, 337, 338, 339, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 772, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 777, 778, 779, 776, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 361, 0, 345, 346, + 721, 722, 0, 0, 552, 498, 653, 0, 2505, 353, + 354, 355, 356, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 412, 1265, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 0, 699, 648, 560, 500, 0, + 716, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 275, 1272, 1273, 0, 0, 0, 0, 383, + 276, 643, 770, 645, 644, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1276, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 0, 0, 0, 0, 0, 0, 0, 368, + 568, 1259, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 0, 0, 583, 613, 405, 603, + 916, 594, 372, 915, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 629, 465, + 466, 467, 468, 469, 470, 430, 530, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 0, 0, 767, 0, + 596, 0, 0, 0, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 614, 0, 547, 520, 809, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 1263, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 404, 516, 728, 765, + 766, 650, 0, 714, 651, 661, 397, 686, 698, 697, + 510, 609, 0, 709, 712, 640, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 1264, 744, 592, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 1267, 702, 703, 504, 505, + 506, 507, 425, 729, 1262, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 1274, 1260, 1270, 1261, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 1271, 680, 708, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 0, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 292, 293, 294, 295, 296, 297, 298, 299, + 340, 300, 301, 302, 303, 304, 305, 306, 311, 312, + 313, 314, 315, 316, 317, 318, 727, 309, 310, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 0, 0, 0, 0, 341, 786, 787, + 788, 789, 790, 0, 0, 342, 343, 344, 0, 0, + 307, 308, 335, 567, 336, 337, 338, 339, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 772, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 777, 778, 779, 776, 1258, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 345, 346, 721, 722, + 0, 0, 552, 498, 653, 353, 354, 355, 356, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 0, 699, 648, 560, 500, 0, 716, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 1272, + 1273, 0, 0, 0, 0, 383, 276, 643, 770, 645, + 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1276, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 0, 0, + 0, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 0, 0, 583, 613, 405, 603, 916, 594, 372, 915, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 629, 465, 466, 467, 468, 469, + 470, 430, 530, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 0, 0, 767, 0, 596, 0, 0, 0, + 0, 0, 0, 566, 0, 0, 471, 0, 0, 0, + 614, 0, 547, 520, 809, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 0, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 0, 479, 480, 421, 352, + 358, 804, 404, 516, 728, 765, 766, 650, 0, 714, + 651, 661, 397, 686, 698, 697, 510, 609, 0, 709, + 712, 640, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 592, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 618, 702, 703, 504, 505, 506, 507, 425, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 1274, 2620, 1270, 2621, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 1271, + 680, 708, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 333, 334, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 0, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 292, 293, + 294, 295, 296, 297, 298, 299, 340, 300, 301, 302, + 303, 304, 305, 306, 311, 312, 313, 314, 315, 316, + 317, 318, 727, 309, 310, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 0, + 0, 0, 0, 341, 786, 787, 788, 789, 790, 0, + 0, 342, 343, 344, 0, 0, 307, 308, 335, 567, + 336, 337, 338, 339, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 772, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 777, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 345, 346, 721, 722, 0, 0, 552, 498, + 653, 353, 354, 355, 356, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 0, 3859, 0, 0, 0, + 0, 0, 0, 0, 412, 0, 0, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 0, 699, 648, 560, + 500, 0, 716, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, + 0, 383, 276, 643, 770, 645, 644, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 0, 0, 0, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 0, 0, 583, 613, + 405, 603, 0, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 629, 465, 466, 467, 468, 469, 470, 430, 530, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3862, 0, 0, 0, 0, 3861, 762, 0, 0, + 767, 0, 596, 0, 0, 0, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 614, 0, 547, 520, + 809, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 404, 516, + 728, 765, 766, 650, 0, 714, 651, 661, 397, 686, + 698, 697, 510, 609, 0, 709, 712, 640, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 592, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 618, 702, 703, + 504, 505, 506, 507, 425, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 0, 359, 657, 482, 536, 419, + 724, 725, 0, 780, 292, 293, 294, 295, 296, 297, + 298, 299, 340, 300, 301, 302, 303, 304, 305, 306, + 311, 312, 313, 314, 315, 316, 317, 318, 727, 309, + 310, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 0, 0, 0, 0, 341, + 786, 787, 788, 789, 790, 0, 0, 342, 343, 344, + 0, 0, 307, 308, 335, 567, 336, 337, 338, 339, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 772, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 777, 778, 779, 776, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 361, 0, 345, 346, + 721, 722, 0, 0, 552, 498, 653, 353, 354, 355, + 356, 357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 662, 696, 685, 774, 649, + 0, 0, 0, 0, 0, 2681, 0, 0, 0, 0, + 412, 0, 0, 481, 700, 681, 692, 682, 524, 667, + 668, 669, 676, 424, 670, 807, 672, 641, 673, 642, + 674, 675, 0, 699, 648, 560, 500, 0, 716, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 275, 0, 0, 2682, 0, 0, 0, 383, 276, 643, + 770, 645, 644, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 386, 0, 0, 1598, 0, 1599, 1597, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 561, 589, 0, 602, 0, 450, 451, + 0, 0, 0, 0, 0, 0, 0, 368, 568, 586, + 384, 555, 600, 389, 563, 579, 379, 517, 551, 0, + 0, 370, 584, 562, 495, 369, 0, 544, 409, 426, + 406, 515, 0, 0, 583, 613, 405, 603, 0, 594, + 372, 0, 593, 514, 487, 580, 585, 496, 489, 0, + 371, 582, 494, 488, 464, 416, 629, 465, 466, 467, + 468, 469, 470, 430, 530, 485, 531, 431, 502, 501, + 503, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 0, 0, 0, 0, 0, 624, 625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 762, 0, 0, 767, 0, 596, 0, + 0, 0, 0, 0, 0, 566, 0, 0, 471, 0, + 0, 0, 614, 0, 547, 520, 809, 0, 0, 545, + 483, 581, 532, 587, 569, 595, 539, 533, 362, 570, + 408, 497, 380, 382, 796, 410, 413, 417, 418, 508, + 509, 526, 554, 573, 574, 575, 407, 394, 546, 395, + 427, 396, 363, 399, 398, 400, 556, 401, 365, 527, + 578, 0, 423, 542, 492, 366, 491, 528, 577, 576, + 381, 604, 611, 612, 704, 0, 617, 810, 811, 812, + 626, 0, 534, 377, 374, 0, 0, 0, 403, 529, + 390, 392, 393, 391, 523, 525, 631, 632, 633, 635, + 636, 637, 638, 0, 0, 0, 0, 639, 705, 723, + 689, 658, 619, 713, 655, 659, 660, 444, 445, 446, + 447, 726, 0, 0, 0, 610, 472, 473, 0, 415, + 414, 493, 367, 0, 0, 461, 443, 535, 373, 411, + 463, 449, 474, 475, 476, 477, 478, 0, 479, 480, + 421, 352, 358, 804, 404, 516, 728, 765, 766, 650, + 0, 714, 651, 661, 397, 686, 698, 697, 510, 609, + 0, 709, 712, 640, 803, 0, 706, 720, 808, 719, + 800, 522, 0, 553, 717, 664, 0, 710, 683, 684, + 0, 711, 679, 715, 0, 652, 0, 620, 623, 654, + 741, 742, 743, 364, 622, 745, 746, 747, 748, 749, + 750, 751, 744, 592, 687, 663, 690, 601, 666, 665, + 0, 0, 701, 618, 702, 703, 504, 505, 506, 507, + 425, 729, 388, 621, 537, 538, 0, 688, 0, 0, + 0, 0, 0, 0, 0, 0, 693, 694, 691, 813, + 0, 752, 753, 0, 0, 615, 616, 420, 0, 634, + 428, 387, 521, 422, 599, 452, 0, 627, 695, 628, + 540, 541, 756, 761, 757, 758, 760, 781, 511, 442, + 448, 557, 462, 484, 543, 598, 519, 548, 385, 588, + 559, 490, 680, 708, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 333, 334, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 736, 735, 734, 733, 732, 731, 730, 0, + 0, 677, 402, 801, 795, 802, 782, 785, 784, 759, + 0, 359, 657, 482, 536, 419, 724, 725, 0, 780, + 292, 293, 294, 295, 296, 297, 298, 299, 340, 300, + 301, 302, 303, 304, 305, 306, 311, 312, 313, 314, + 315, 316, 317, 318, 727, 309, 310, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 0, 0, 0, 0, 341, 786, 787, 788, 789, + 790, 0, 0, 342, 343, 344, 0, 0, 307, 308, + 335, 567, 336, 337, 338, 339, 0, 0, 605, 606, + 607, 630, 0, 608, 590, 656, 429, 360, 571, 597, + 798, 799, 0, 0, 0, 0, 0, 0, 0, 707, + 718, 754, 755, 0, 768, 769, 771, 773, 772, 775, + 564, 565, 783, 0, 0, 453, 375, 376, 512, 513, + 550, 0, 454, 455, 456, 460, 457, 458, 459, 777, + 778, 779, 776, 486, 549, 572, 558, 797, 499, 347, + 794, 348, 349, 350, 351, 0, 805, 646, 647, 806, + 764, 0, 361, 0, 345, 346, 721, 722, 0, 0, + 552, 498, 653, 353, 354, 355, 356, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 412, 1909, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 0, 699, + 648, 560, 500, 0, 716, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 275, 0, 0, 1907, + 0, 0, 0, 383, 276, 643, 770, 645, 644, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 386, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 1905, 0, 0, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 0, 0, + 583, 613, 405, 603, 0, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 629, 465, 466, 467, 468, 469, 470, 430, + 530, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, + 0, 0, 767, 0, 596, 0, 0, 0, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 614, 0, + 547, 520, 809, 0, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 0, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 404, 516, 728, 765, 766, 650, 0, 714, 651, 661, + 397, 686, 698, 697, 510, 609, 0, 709, 712, 640, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 592, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 618, + 702, 703, 504, 505, 506, 507, 425, 729, 388, 621, + 537, 538, 0, 688, 0, 0, 0, 0, 0, 0, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 333, 334, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 0, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 292, 293, 294, 295, + 296, 297, 298, 299, 340, 300, 301, 302, 303, 304, + 305, 306, 311, 312, 313, 314, 315, 316, 317, 318, + 727, 309, 310, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 0, 0, 0, + 0, 341, 786, 787, 788, 789, 790, 0, 0, 342, + 343, 344, 0, 0, 307, 308, 335, 567, 336, 337, + 338, 339, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 772, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 777, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 345, 346, 721, 722, 0, 0, 552, 498, 653, 353, + 354, 355, 356, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 412, 1903, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 0, 699, 648, 560, 500, 0, + 716, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 275, 0, 0, 1907, 0, 0, 0, 383, + 276, 643, 770, 645, 644, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 386, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 1905, 0, 0, 0, 0, 0, 0, 368, + 568, 586, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 0, 0, 583, 613, 405, 603, + 0, 594, 372, 0, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 629, 465, + 466, 467, 468, 469, 470, 430, 530, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 0, 0, 767, 0, + 596, 0, 0, 0, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 614, 0, 547, 520, 809, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 539, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 404, 516, 728, 765, + 766, 650, 0, 714, 651, 661, 397, 686, 698, 697, + 510, 609, 0, 709, 712, 640, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 751, 744, 592, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 618, 702, 703, 504, 505, + 506, 507, 425, 729, 388, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 511, 442, 448, 557, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 490, 680, 708, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 0, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 292, 293, 294, 295, 296, 297, 298, 299, + 340, 300, 301, 302, 303, 304, 305, 306, 311, 312, + 313, 314, 315, 316, 317, 318, 727, 309, 310, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 0, 0, 0, 0, 341, 786, 787, + 788, 789, 790, 0, 0, 342, 343, 344, 0, 0, + 307, 308, 335, 567, 336, 337, 338, 339, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 772, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 777, 778, 779, 776, 486, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 345, 346, 721, 722, + 0, 0, 552, 498, 653, 353, 354, 355, 356, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 412, 1867, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 0, 699, 648, 560, 500, 0, 716, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 383, 276, 643, 770, 645, + 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 386, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1868, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 0, 0, + 0, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 0, 0, 583, 613, 405, 603, 0, 594, 372, 1866, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 629, 465, 466, 467, 468, 469, + 470, 430, 530, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 0, 0, 767, 0, 596, 0, 0, 0, + 0, 0, 0, 566, 0, 0, 471, 0, 0, 0, + 614, 0, 547, 520, 809, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 0, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 0, 479, 480, 421, 352, + 358, 804, 404, 516, 728, 765, 766, 650, 0, 714, + 651, 661, 397, 686, 698, 697, 510, 609, 0, 709, + 712, 640, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 592, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 618, 702, 703, 504, 505, 506, 507, 425, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 511, 442, 448, 557, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 490, + 680, 708, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 333, 334, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 0, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 292, 293, + 294, 295, 296, 297, 298, 299, 340, 300, 301, 302, + 303, 304, 305, 306, 311, 312, 313, 314, 315, 316, + 317, 318, 727, 309, 310, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 0, + 0, 0, 0, 341, 786, 787, 788, 789, 790, 0, + 0, 342, 343, 344, 0, 0, 307, 308, 335, 567, + 336, 337, 338, 339, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 772, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 777, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 345, 346, 721, 722, 0, 0, 552, 498, + 653, 353, 354, 355, 356, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 0, 1225, 0, 0, 0, + 0, 0, 0, 1230, 412, 0, 0, 481, 700, 1226, + 692, 682, 1228, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 0, 699, 648, 560, + 500, 0, 716, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, + 0, 383, 276, 643, 770, 645, 644, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 0, 0, 0, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 0, 0, 583, 613, + 405, 603, 0, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 629, 465, 466, 467, 468, 469, 470, 430, 530, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 0, 0, + 767, 0, 596, 0, 1229, 0, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 614, 0, 547, 520, + 809, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 404, 516, + 728, 765, 766, 650, 0, 714, 651, 661, 397, 686, + 698, 697, 510, 609, 0, 709, 712, 640, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 592, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 618, 702, 703, + 504, 505, 506, 507, 425, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 0, 359, 657, 482, 536, 419, + 724, 725, 0, 780, 292, 293, 294, 295, 296, 297, + 298, 299, 340, 300, 301, 302, 303, 304, 305, 306, + 311, 312, 313, 314, 315, 316, 317, 318, 727, 309, + 310, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 0, 0, 0, 0, 341, + 786, 787, 788, 789, 790, 0, 0, 342, 343, 344, + 0, 0, 307, 308, 335, 567, 336, 337, 338, 339, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 772, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 777, 778, 779, 776, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 361, 0, 345, 346, + 721, 722, 0, 0, 552, 498, 653, 353, 354, 355, + 356, 357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 518, 0, 0, 662, 696, 685, 774, 649, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 412, 0, 0, 481, 700, 681, 692, 682, 524, 667, + 668, 669, 676, 424, 670, 807, 672, 641, 673, 642, + 674, 675, 0, 699, 648, 560, 500, 0, 716, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5385, 0, + 275, 1091, 0, 0, 0, 0, 0, 383, 276, 643, + 770, 645, 644, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 386, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 561, 589, 0, 602, 0, 450, 451, + 0, 0, 0, 0, 0, 0, 0, 368, 568, 586, + 384, 555, 600, 389, 563, 579, 379, 517, 551, 0, + 0, 370, 584, 562, 495, 369, 0, 544, 409, 426, + 406, 515, 0, 0, 583, 613, 405, 603, 0, 594, + 372, 0, 593, 514, 487, 580, 585, 496, 489, 0, + 371, 582, 494, 488, 464, 416, 629, 465, 466, 467, + 468, 469, 470, 430, 530, 485, 531, 431, 502, 501, + 503, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 0, 0, 0, 0, 0, 624, 625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 762, 0, 0, 767, 0, 596, 0, + 0, 0, 0, 0, 0, 566, 0, 0, 471, 0, + 0, 0, 614, 0, 547, 520, 809, 0, 0, 545, + 483, 581, 532, 587, 569, 595, 539, 533, 362, 570, + 408, 497, 380, 382, 796, 410, 413, 417, 418, 508, + 509, 526, 554, 573, 574, 575, 407, 394, 546, 395, + 427, 396, 363, 399, 398, 400, 556, 401, 365, 527, + 578, 0, 423, 542, 492, 366, 491, 528, 577, 576, + 381, 604, 611, 612, 704, 0, 617, 810, 811, 812, + 626, 0, 534, 377, 374, 0, 0, 0, 403, 529, + 390, 392, 393, 391, 523, 525, 631, 632, 633, 635, + 636, 637, 638, 0, 0, 0, 0, 639, 705, 723, + 689, 658, 619, 713, 655, 659, 660, 444, 445, 446, + 447, 726, 0, 0, 0, 610, 472, 473, 0, 415, + 414, 493, 367, 0, 0, 461, 443, 535, 373, 411, + 463, 449, 474, 475, 476, 477, 478, 0, 479, 480, + 421, 352, 358, 804, 404, 516, 728, 765, 766, 650, + 0, 714, 651, 661, 397, 686, 698, 697, 510, 609, + 0, 709, 712, 640, 803, 0, 706, 720, 808, 719, + 800, 522, 0, 553, 717, 664, 0, 710, 683, 684, + 0, 711, 679, 715, 0, 652, 0, 620, 623, 654, + 741, 742, 743, 364, 622, 745, 746, 747, 748, 749, + 750, 751, 744, 592, 687, 663, 690, 601, 666, 665, + 0, 0, 701, 618, 702, 703, 504, 505, 506, 507, + 425, 729, 388, 621, 537, 538, 0, 688, 0, 0, + 0, 0, 0, 0, 0, 0, 693, 694, 691, 813, + 0, 752, 753, 0, 0, 615, 616, 420, 0, 634, + 428, 387, 521, 422, 599, 452, 0, 627, 695, 628, + 540, 541, 756, 761, 757, 758, 760, 781, 511, 442, + 448, 557, 462, 484, 543, 598, 519, 548, 385, 588, + 559, 490, 680, 708, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 333, 334, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 736, 735, 734, 733, 732, 731, 730, 0, + 0, 677, 402, 801, 795, 802, 782, 785, 784, 759, + 0, 359, 657, 482, 536, 419, 724, 725, 0, 780, + 292, 293, 294, 295, 296, 297, 298, 299, 340, 300, + 301, 302, 303, 304, 305, 306, 311, 312, 313, 314, + 315, 316, 317, 318, 727, 309, 310, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 0, 0, 0, 0, 341, 786, 787, 788, 789, + 790, 0, 0, 342, 343, 344, 0, 0, 307, 308, + 335, 567, 336, 337, 338, 339, 0, 0, 605, 606, + 607, 630, 0, 608, 590, 656, 429, 360, 571, 597, + 798, 799, 0, 0, 0, 0, 0, 0, 0, 707, + 718, 754, 755, 0, 768, 769, 771, 773, 772, 775, + 564, 565, 783, 0, 0, 453, 375, 376, 512, 513, + 550, 0, 454, 455, 456, 460, 457, 458, 459, 777, + 778, 779, 776, 486, 549, 572, 558, 797, 499, 347, + 794, 348, 349, 350, 351, 0, 805, 646, 647, 806, + 764, 763, 361, 0, 345, 346, 721, 722, 0, 0, + 552, 498, 653, 353, 354, 355, 356, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 412, 0, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 0, 699, + 648, 560, 500, 0, 716, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 275, 0, 0, 1907, + 0, 0, 0, 383, 276, 643, 770, 645, 644, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 386, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 1905, 0, 0, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 0, 0, + 583, 613, 405, 603, 0, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 629, 465, 466, 467, 468, 469, 470, 430, + 530, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, + 0, 0, 767, 0, 596, 0, 0, 0, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 614, 0, + 547, 520, 809, 0, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 0, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 404, 516, 728, 765, 766, 650, 0, 714, 651, 661, + 397, 686, 698, 697, 510, 609, 0, 709, 712, 640, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 592, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 618, + 702, 703, 504, 505, 506, 507, 425, 729, 388, 621, + 537, 538, 0, 688, 0, 0, 0, 0, 0, 0, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 333, 334, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 0, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 292, 293, 294, 295, + 296, 297, 298, 299, 340, 300, 301, 302, 303, 304, + 305, 306, 311, 312, 313, 314, 315, 316, 317, 318, + 727, 309, 310, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 0, 0, 0, + 0, 341, 786, 787, 788, 789, 790, 0, 0, 342, + 343, 344, 0, 0, 307, 308, 335, 567, 336, 337, + 338, 339, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 772, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 777, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 345, 346, 721, 722, 0, 0, 552, 498, 653, 353, + 354, 355, 356, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 412, 0, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 0, 699, 648, 560, 500, 0, + 716, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 275, 0, 0, 1907, 0, 0, 0, 383, + 276, 643, 770, 645, 644, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 386, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 2233, 0, 0, 0, 0, 0, 0, 368, + 568, 586, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 0, 0, 583, 613, 405, 603, + 0, 594, 372, 0, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 629, 465, + 466, 467, 468, 469, 470, 430, 530, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 0, 0, 767, 0, + 596, 0, 0, 0, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 614, 0, 547, 520, 809, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 539, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 404, 516, 728, 765, + 766, 650, 0, 714, 651, 661, 397, 686, 698, 697, + 510, 609, 0, 709, 712, 640, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 751, 744, 592, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 618, 702, 703, 504, 505, + 506, 507, 425, 729, 388, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 511, 442, 448, 557, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 490, 680, 708, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 0, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 292, 293, 294, 295, 296, 297, 298, 299, + 340, 300, 301, 302, 303, 304, 305, 306, 311, 312, + 313, 314, 315, 316, 317, 318, 727, 309, 310, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 0, 0, 0, 0, 341, 786, 787, + 788, 789, 790, 0, 0, 342, 343, 344, 0, 0, + 307, 308, 335, 567, 336, 337, 338, 339, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 772, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 777, 778, 779, 776, 486, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 345, 346, 721, 722, + 0, 0, 552, 498, 653, 353, 354, 355, 356, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 0, 699, 648, 560, 500, 0, 716, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, + 0, 0, 0, 0, 0, 383, 276, 643, 770, 645, + 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 386, 0, 0, 0, 0, 0, 0, 4763, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4764, 0, 0, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 0, 0, + 0, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 0, 0, 583, 613, 405, 603, 0, 594, 372, 0, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 629, 465, 466, 467, 468, 469, + 470, 430, 530, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 0, 0, 767, 0, 596, 0, 0, 0, + 0, 0, 0, 566, 0, 0, 471, 0, 0, 0, + 614, 0, 547, 520, 809, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 0, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 0, 479, 480, 421, 352, + 358, 804, 404, 516, 728, 765, 766, 650, 0, 714, + 651, 661, 397, 686, 698, 697, 510, 609, 0, 709, + 712, 640, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 592, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 618, 702, 703, 504, 505, 506, 507, 425, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 511, 442, 448, 557, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 490, + 680, 708, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 333, 334, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 0, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 292, 293, + 294, 295, 296, 297, 298, 299, 340, 300, 301, 302, + 303, 304, 305, 306, 311, 312, 313, 314, 315, 316, + 317, 318, 727, 309, 310, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 0, + 0, 0, 0, 341, 786, 787, 788, 789, 790, 0, + 0, 342, 343, 344, 0, 0, 307, 308, 335, 567, + 336, 337, 338, 339, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 772, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 777, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 345, 346, 721, 722, 0, 0, 552, 498, + 653, 353, 354, 355, 356, 357, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 518, 0, 0, 662, + 696, 685, 774, 649, 0, 0, 0, 0, 0, 2681, + 0, 0, 0, 0, 412, 0, 0, 481, 700, 681, + 692, 682, 524, 667, 668, 669, 676, 424, 670, 807, + 672, 641, 673, 642, 674, 675, 0, 699, 648, 560, + 500, 0, 716, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 275, 0, 0, 2682, 0, 0, + 0, 383, 276, 643, 770, 645, 644, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 561, 589, 0, + 602, 0, 450, 451, 0, 0, 0, 0, 0, 0, + 0, 368, 568, 586, 384, 555, 600, 389, 563, 579, + 379, 517, 551, 0, 0, 370, 584, 562, 495, 369, + 0, 544, 409, 426, 406, 515, 0, 0, 583, 613, + 405, 603, 0, 594, 372, 0, 593, 514, 487, 580, + 585, 496, 489, 0, 371, 582, 494, 488, 464, 416, + 629, 465, 466, 467, 468, 469, 470, 430, 530, 485, + 531, 431, 502, 501, 503, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 0, 0, 0, 0, 0, + 624, 625, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 0, 0, + 767, 0, 596, 0, 0, 0, 0, 0, 0, 566, + 0, 0, 471, 0, 0, 0, 614, 0, 547, 520, + 809, 0, 0, 545, 483, 581, 532, 587, 569, 595, + 539, 533, 362, 570, 408, 497, 380, 382, 796, 410, + 413, 417, 418, 508, 509, 526, 554, 573, 574, 575, + 407, 394, 546, 395, 427, 396, 363, 399, 398, 400, + 556, 401, 365, 527, 578, 0, 423, 542, 492, 366, + 491, 528, 577, 576, 381, 604, 611, 612, 704, 0, + 617, 810, 811, 812, 626, 0, 534, 377, 374, 0, + 0, 0, 403, 529, 390, 392, 393, 391, 523, 525, + 631, 632, 633, 635, 636, 637, 638, 0, 0, 0, + 0, 639, 705, 723, 689, 658, 619, 713, 655, 659, + 660, 444, 445, 446, 447, 726, 0, 0, 0, 610, + 472, 473, 0, 415, 414, 493, 367, 0, 0, 461, + 443, 535, 373, 411, 463, 449, 474, 475, 476, 477, + 478, 0, 479, 480, 421, 352, 358, 804, 404, 516, + 728, 765, 766, 650, 0, 714, 651, 661, 397, 686, + 698, 697, 510, 609, 0, 709, 712, 640, 803, 0, + 706, 720, 808, 719, 800, 522, 0, 553, 717, 664, + 0, 710, 683, 684, 0, 711, 679, 715, 0, 652, + 0, 620, 623, 654, 741, 742, 743, 364, 622, 745, + 746, 747, 748, 749, 750, 751, 744, 592, 687, 663, + 690, 601, 666, 665, 0, 0, 701, 618, 702, 703, + 504, 505, 506, 507, 425, 729, 388, 621, 537, 538, + 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 694, 691, 813, 0, 752, 753, 0, 0, 615, + 616, 420, 0, 634, 428, 387, 521, 422, 599, 452, + 0, 627, 695, 628, 540, 541, 756, 761, 757, 758, + 760, 781, 511, 442, 448, 557, 462, 484, 543, 598, + 519, 548, 385, 588, 559, 490, 680, 708, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, + 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 737, 736, 735, 734, 733, + 732, 731, 730, 0, 0, 677, 402, 801, 795, 802, + 782, 785, 784, 759, 0, 359, 657, 482, 536, 419, + 724, 725, 0, 780, 292, 293, 294, 295, 296, 297, + 298, 299, 340, 300, 301, 302, 303, 304, 305, 306, + 311, 312, 313, 314, 315, 316, 317, 318, 727, 309, + 310, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 0, 0, 0, 0, 341, + 786, 787, 788, 789, 790, 0, 0, 342, 343, 344, + 0, 0, 307, 308, 335, 567, 336, 337, 338, 339, + 0, 0, 605, 606, 607, 630, 0, 608, 590, 656, + 429, 360, 571, 597, 798, 799, 0, 0, 0, 0, + 0, 0, 0, 707, 718, 754, 755, 0, 768, 769, + 771, 773, 772, 775, 564, 565, 783, 0, 0, 453, + 375, 376, 512, 513, 550, 0, 454, 455, 456, 460, + 457, 458, 459, 777, 778, 779, 776, 486, 549, 572, + 558, 797, 499, 347, 794, 348, 349, 350, 351, 0, + 805, 646, 647, 806, 764, 763, 361, 0, 345, 346, + 721, 722, 0, 0, 552, 498, 653, 353, 354, 355, + 356, 357, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 518, 0, 0, 662, 696, 685, 774, 649, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 412, 0, 0, 481, 700, 681, 692, 682, 524, 667, + 668, 669, 676, 424, 670, 807, 672, 641, 673, 642, + 674, 675, 0, 699, 648, 560, 500, 0, 716, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 275, 0, 0, 4342, 4343, 0, 0, 383, 276, 643, + 770, 645, 644, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 386, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 561, 589, 0, 602, 0, 450, 451, + 0, 0, 0, 0, 0, 0, 0, 368, 568, 586, + 384, 555, 600, 389, 563, 579, 379, 517, 551, 0, + 0, 370, 584, 562, 495, 369, 0, 544, 409, 426, + 406, 515, 0, 0, 583, 613, 405, 603, 0, 594, + 372, 0, 593, 514, 487, 580, 585, 496, 489, 0, + 371, 582, 494, 488, 464, 416, 629, 465, 466, 467, + 468, 469, 470, 430, 530, 485, 531, 431, 502, 501, + 503, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 0, 0, 0, 0, 0, 624, 625, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 762, 0, 0, 767, 0, 596, 0, + 0, 0, 0, 0, 0, 566, 0, 0, 471, 0, + 0, 0, 614, 0, 547, 520, 809, 0, 0, 545, + 483, 581, 532, 587, 569, 595, 539, 533, 362, 570, + 408, 497, 380, 382, 796, 410, 413, 417, 418, 508, + 509, 526, 554, 573, 574, 575, 407, 394, 546, 395, + 427, 396, 363, 399, 398, 400, 556, 401, 365, 527, + 578, 0, 423, 542, 492, 366, 491, 528, 577, 576, + 381, 604, 611, 612, 704, 0, 617, 810, 811, 812, + 626, 0, 534, 377, 374, 0, 0, 0, 403, 529, + 390, 392, 393, 391, 523, 525, 631, 632, 633, 635, + 636, 637, 638, 0, 0, 0, 0, 639, 705, 723, + 689, 658, 619, 713, 655, 659, 660, 444, 445, 446, + 447, 726, 0, 0, 0, 610, 472, 473, 0, 415, + 414, 493, 367, 0, 0, 461, 443, 535, 373, 411, + 463, 449, 474, 475, 476, 477, 478, 0, 479, 480, + 421, 352, 358, 804, 404, 516, 728, 765, 766, 650, + 0, 714, 651, 661, 397, 686, 698, 697, 510, 609, + 0, 709, 712, 640, 803, 0, 706, 720, 808, 719, + 800, 522, 0, 553, 717, 664, 0, 710, 683, 684, + 0, 711, 679, 715, 0, 652, 0, 620, 623, 654, + 741, 742, 743, 364, 622, 745, 746, 747, 748, 749, + 750, 751, 744, 592, 687, 663, 690, 601, 666, 665, + 0, 0, 701, 618, 702, 703, 504, 505, 506, 507, + 425, 729, 388, 621, 537, 538, 0, 688, 0, 0, + 0, 0, 0, 0, 0, 0, 693, 694, 691, 813, + 0, 752, 753, 0, 0, 615, 616, 420, 0, 634, + 428, 387, 521, 422, 599, 452, 0, 627, 695, 628, + 540, 541, 756, 761, 757, 758, 760, 781, 511, 442, + 448, 557, 462, 484, 543, 598, 519, 548, 385, 588, + 559, 490, 680, 708, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 333, 334, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 737, 736, 735, 734, 733, 732, 731, 730, 0, + 0, 677, 402, 801, 795, 802, 782, 785, 784, 759, + 0, 359, 657, 482, 536, 419, 724, 725, 0, 780, + 292, 293, 294, 295, 296, 297, 298, 299, 340, 300, + 301, 302, 303, 304, 305, 306, 311, 312, 313, 314, + 315, 316, 317, 318, 727, 309, 310, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 0, 0, 0, 0, 341, 786, 787, 788, 789, + 790, 0, 0, 342, 343, 344, 0, 0, 307, 308, + 335, 567, 336, 337, 338, 339, 0, 0, 605, 606, + 607, 630, 0, 608, 590, 656, 429, 360, 571, 597, + 798, 799, 0, 0, 0, 0, 0, 0, 0, 707, + 718, 754, 755, 0, 768, 769, 771, 773, 772, 775, + 564, 565, 783, 0, 0, 453, 375, 376, 512, 513, + 550, 0, 454, 455, 456, 460, 457, 458, 459, 777, + 778, 779, 776, 486, 549, 572, 558, 797, 499, 347, + 794, 348, 349, 350, 351, 0, 805, 646, 647, 806, + 764, 763, 361, 0, 345, 346, 721, 722, 0, 0, + 552, 498, 653, 353, 354, 355, 356, 357, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 518, 0, + 0, 662, 696, 685, 774, 649, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 412, 0, 0, 481, + 700, 681, 692, 682, 524, 667, 668, 669, 676, 424, + 670, 807, 672, 641, 673, 642, 674, 675, 0, 699, + 648, 560, 500, 0, 716, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 275, 0, 0, 4099, + 4101, 0, 0, 383, 276, 643, 770, 645, 644, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 386, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 561, + 589, 0, 602, 0, 450, 451, 0, 0, 0, 0, + 0, 0, 0, 368, 568, 586, 384, 555, 600, 389, + 563, 579, 379, 517, 551, 0, 0, 370, 584, 562, + 495, 369, 0, 544, 409, 426, 406, 515, 0, 0, + 583, 613, 405, 603, 0, 594, 372, 0, 593, 514, + 487, 580, 585, 496, 489, 0, 371, 582, 494, 488, + 464, 416, 629, 465, 466, 467, 468, 469, 470, 430, + 530, 485, 531, 431, 502, 501, 503, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 0, 0, 0, + 0, 0, 624, 625, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 762, + 0, 0, 767, 0, 596, 0, 0, 0, 0, 0, + 0, 566, 0, 0, 471, 0, 0, 0, 614, 0, + 547, 520, 809, 0, 0, 545, 483, 581, 532, 587, + 569, 595, 539, 533, 362, 570, 408, 497, 380, 382, + 796, 410, 413, 417, 418, 508, 509, 526, 554, 573, + 574, 575, 407, 394, 546, 395, 427, 396, 363, 399, + 398, 400, 556, 401, 365, 527, 578, 0, 423, 542, + 492, 366, 491, 528, 577, 576, 381, 604, 611, 612, + 704, 0, 617, 810, 811, 812, 626, 0, 534, 377, + 374, 0, 0, 0, 403, 529, 390, 392, 393, 391, + 523, 525, 631, 632, 633, 635, 636, 637, 638, 0, + 0, 0, 0, 639, 705, 723, 689, 658, 619, 713, + 655, 659, 660, 444, 445, 446, 447, 726, 0, 0, + 0, 610, 472, 473, 0, 415, 414, 493, 367, 0, + 0, 461, 443, 535, 373, 411, 463, 449, 474, 475, + 476, 477, 478, 0, 479, 480, 421, 352, 358, 804, + 404, 516, 728, 765, 766, 650, 0, 714, 651, 661, + 397, 686, 698, 697, 510, 609, 0, 709, 712, 640, + 803, 0, 706, 720, 808, 719, 800, 522, 0, 553, + 717, 664, 0, 710, 683, 684, 0, 711, 679, 715, + 0, 652, 0, 620, 623, 654, 741, 742, 743, 364, + 622, 745, 746, 747, 748, 749, 750, 751, 744, 592, + 687, 663, 690, 601, 666, 665, 0, 0, 701, 618, + 702, 703, 504, 505, 506, 507, 425, 729, 388, 621, + 537, 538, 0, 688, 0, 0, 0, 0, 0, 0, + 0, 0, 693, 694, 691, 813, 0, 752, 753, 0, + 0, 615, 616, 420, 0, 634, 428, 387, 521, 422, + 599, 452, 0, 627, 695, 628, 540, 541, 756, 761, + 757, 758, 760, 781, 511, 442, 448, 557, 462, 484, + 543, 598, 519, 548, 385, 588, 559, 490, 680, 708, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 333, 334, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 737, 736, 735, + 734, 733, 732, 731, 730, 0, 0, 677, 402, 801, + 795, 802, 782, 785, 784, 759, 0, 359, 657, 482, + 536, 419, 724, 725, 0, 780, 292, 293, 294, 295, + 296, 297, 298, 299, 340, 300, 301, 302, 303, 304, + 305, 306, 311, 312, 313, 314, 315, 316, 317, 318, + 727, 309, 310, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 0, 0, 0, + 0, 341, 786, 787, 788, 789, 790, 0, 0, 342, + 343, 344, 0, 0, 307, 308, 335, 567, 336, 337, + 338, 339, 0, 0, 605, 606, 607, 630, 0, 608, + 590, 656, 429, 360, 571, 597, 798, 799, 0, 0, + 0, 0, 0, 0, 0, 707, 718, 754, 755, 0, + 768, 769, 771, 773, 772, 775, 564, 565, 783, 0, + 0, 453, 375, 376, 512, 513, 550, 0, 454, 455, + 456, 460, 457, 458, 459, 777, 778, 779, 776, 486, + 549, 572, 558, 797, 499, 347, 794, 348, 349, 350, + 351, 0, 805, 646, 647, 806, 764, 763, 361, 0, + 345, 346, 721, 722, 0, 0, 552, 498, 653, 353, + 354, 355, 356, 357, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 518, 0, 0, 662, 696, 685, + 774, 649, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 412, 0, 0, 481, 700, 681, 692, 682, + 524, 667, 668, 669, 676, 424, 670, 807, 672, 641, + 673, 642, 674, 675, 0, 699, 648, 560, 500, 0, + 716, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3717, + 0, 0, 275, 0, 0, 3721, 0, 0, 0, 383, + 276, 643, 770, 645, 644, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 386, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 561, 589, 0, 602, 0, + 450, 451, 0, 0, 0, 0, 0, 0, 0, 368, + 568, 586, 384, 555, 600, 389, 563, 579, 379, 517, + 551, 0, 0, 370, 584, 562, 495, 369, 0, 544, + 409, 426, 406, 515, 0, 0, 583, 613, 405, 603, + 0, 594, 372, 0, 593, 514, 487, 580, 585, 496, + 489, 0, 371, 582, 494, 488, 464, 416, 629, 465, + 466, 467, 468, 469, 470, 430, 530, 485, 531, 431, + 502, 501, 503, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 0, 0, 0, 0, 0, 624, 625, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 762, 0, 0, 767, 0, + 596, 0, 0, 0, 0, 0, 0, 566, 0, 0, + 471, 0, 0, 0, 614, 0, 547, 520, 809, 0, + 0, 545, 483, 581, 532, 587, 569, 595, 539, 533, + 362, 570, 408, 497, 380, 382, 796, 410, 413, 417, + 418, 508, 509, 526, 554, 573, 574, 575, 407, 394, + 546, 395, 427, 396, 363, 399, 398, 400, 556, 401, + 365, 527, 578, 0, 423, 542, 492, 366, 491, 528, + 577, 576, 381, 604, 611, 612, 704, 0, 617, 810, + 811, 812, 626, 0, 534, 377, 374, 0, 0, 0, + 403, 529, 390, 392, 393, 391, 523, 525, 631, 632, + 633, 635, 636, 637, 638, 0, 0, 0, 0, 639, + 705, 723, 689, 658, 619, 713, 655, 659, 660, 444, + 445, 446, 447, 726, 0, 0, 0, 610, 472, 473, + 0, 415, 414, 493, 367, 0, 0, 461, 443, 535, + 373, 411, 463, 449, 474, 475, 476, 477, 478, 0, + 479, 480, 421, 352, 358, 804, 404, 516, 728, 765, + 766, 650, 0, 714, 651, 661, 397, 686, 698, 697, + 510, 609, 0, 709, 712, 640, 803, 0, 706, 720, + 808, 719, 800, 522, 0, 553, 717, 664, 0, 710, + 683, 684, 0, 711, 679, 715, 0, 652, 0, 620, + 623, 654, 741, 742, 743, 364, 622, 745, 746, 747, + 748, 749, 750, 751, 744, 592, 687, 663, 690, 601, + 666, 665, 0, 0, 701, 618, 702, 703, 504, 505, + 506, 507, 425, 729, 388, 621, 537, 538, 0, 688, + 0, 0, 0, 0, 0, 0, 0, 0, 693, 694, + 691, 813, 0, 752, 753, 0, 0, 615, 616, 420, + 0, 634, 428, 387, 521, 422, 599, 452, 0, 627, + 695, 628, 540, 541, 756, 761, 757, 758, 760, 781, + 511, 442, 448, 557, 462, 484, 543, 598, 519, 548, + 385, 588, 559, 490, 680, 708, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 737, 736, 735, 734, 733, 732, 731, + 730, 0, 0, 677, 402, 801, 795, 802, 782, 785, + 784, 759, 0, 359, 657, 482, 536, 419, 724, 725, + 0, 780, 292, 293, 294, 295, 296, 297, 298, 299, + 340, 300, 301, 302, 303, 304, 305, 306, 311, 312, + 313, 314, 315, 316, 317, 318, 727, 309, 310, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 0, 0, 0, 0, 341, 786, 787, + 788, 789, 790, 0, 0, 342, 343, 344, 0, 0, + 307, 308, 335, 567, 336, 337, 338, 339, 0, 0, + 605, 606, 607, 630, 0, 608, 590, 656, 429, 360, + 571, 597, 798, 799, 0, 0, 0, 0, 0, 0, + 0, 707, 718, 754, 755, 0, 768, 769, 771, 773, + 772, 775, 564, 565, 783, 0, 0, 453, 375, 376, + 512, 513, 550, 0, 454, 455, 456, 460, 457, 458, + 459, 777, 778, 779, 776, 486, 549, 572, 558, 797, + 499, 347, 794, 348, 349, 350, 351, 0, 805, 646, + 647, 806, 764, 763, 361, 0, 345, 346, 721, 722, + 0, 0, 552, 498, 653, 353, 354, 355, 356, 357, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 518, 0, 0, 662, 696, 685, 774, 649, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, + 0, 481, 700, 681, 692, 682, 524, 667, 668, 669, + 676, 424, 670, 807, 672, 641, 673, 642, 674, 675, + 0, 699, 648, 560, 500, 0, 716, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3711, 0, 0, 275, 0, + 0, 3715, 0, 0, 0, 383, 276, 643, 770, 645, + 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 386, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 561, 589, 0, 602, 0, 450, 451, 0, 0, + 0, 0, 0, 0, 0, 368, 568, 586, 384, 555, + 600, 389, 563, 579, 379, 517, 551, 0, 0, 370, + 584, 562, 495, 369, 0, 544, 409, 426, 406, 515, + 0, 0, 583, 613, 405, 603, 0, 594, 372, 0, + 593, 514, 487, 580, 585, 496, 489, 0, 371, 582, + 494, 488, 464, 416, 629, 465, 466, 467, 468, 469, + 470, 430, 530, 485, 531, 431, 502, 501, 503, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 0, + 0, 0, 0, 0, 624, 625, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 762, 0, 0, 767, 0, 596, 0, 0, 0, + 0, 0, 0, 566, 0, 0, 471, 0, 0, 0, + 614, 0, 547, 520, 809, 0, 0, 545, 483, 581, + 532, 587, 569, 595, 539, 533, 362, 570, 408, 497, + 380, 382, 796, 410, 413, 417, 418, 508, 509, 526, + 554, 573, 574, 575, 407, 394, 546, 395, 427, 396, + 363, 399, 398, 400, 556, 401, 365, 527, 578, 0, + 423, 542, 492, 366, 491, 528, 577, 576, 381, 604, + 611, 612, 704, 0, 617, 810, 811, 812, 626, 0, + 534, 377, 374, 0, 0, 0, 403, 529, 390, 392, + 393, 391, 523, 525, 631, 632, 633, 635, 636, 637, + 638, 0, 0, 0, 0, 639, 705, 723, 689, 658, + 619, 713, 655, 659, 660, 444, 445, 446, 447, 726, + 0, 0, 0, 610, 472, 473, 0, 415, 414, 493, + 367, 0, 0, 461, 443, 535, 373, 411, 463, 449, + 474, 475, 476, 477, 478, 0, 479, 480, 421, 352, + 358, 804, 404, 516, 728, 765, 766, 650, 0, 714, + 651, 661, 397, 686, 698, 697, 510, 609, 0, 709, + 712, 640, 803, 0, 706, 720, 808, 719, 800, 522, + 0, 553, 717, 664, 0, 710, 683, 684, 0, 711, + 679, 715, 0, 652, 0, 620, 623, 654, 741, 742, + 743, 364, 622, 745, 746, 747, 748, 749, 750, 751, + 744, 592, 687, 663, 690, 601, 666, 665, 0, 0, + 701, 618, 702, 703, 504, 505, 506, 507, 425, 729, + 388, 621, 537, 538, 0, 688, 0, 0, 0, 0, + 0, 0, 0, 0, 693, 694, 691, 813, 0, 752, + 753, 0, 0, 615, 616, 420, 0, 634, 428, 387, + 521, 422, 599, 452, 0, 627, 695, 628, 540, 541, + 756, 761, 757, 758, 760, 781, 511, 442, 448, 557, + 462, 484, 543, 598, 519, 548, 385, 588, 559, 490, + 680, 708, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 333, 334, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 737, + 736, 735, 734, 733, 732, 731, 730, 0, 0, 677, + 402, 801, 795, 802, 782, 785, 784, 759, 0, 359, + 657, 482, 536, 419, 724, 725, 0, 780, 292, 293, + 294, 295, 296, 297, 298, 299, 340, 300, 301, 302, + 303, 304, 305, 306, 311, 312, 313, 314, 315, 316, + 317, 318, 727, 309, 310, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 0, + 0, 0, 0, 341, 786, 787, 788, 789, 790, 0, + 0, 342, 343, 344, 0, 0, 307, 308, 335, 567, + 336, 337, 338, 339, 0, 0, 605, 606, 607, 630, + 0, 608, 590, 656, 429, 360, 571, 597, 798, 799, + 0, 0, 0, 0, 0, 0, 0, 707, 718, 754, + 755, 0, 768, 769, 771, 773, 772, 775, 564, 565, + 783, 0, 0, 453, 375, 376, 512, 513, 550, 0, + 454, 455, 456, 460, 457, 458, 459, 777, 778, 779, + 776, 486, 549, 572, 558, 797, 499, 347, 794, 348, + 349, 350, 351, 0, 805, 646, 647, 806, 764, 763, + 361, 0, 345, 346, 721, 722, 0, 0, 552, 498, + 653, 1849, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1846, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 3231, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 1907, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 1907, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 2105, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 2104, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 5474, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 5406, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 1091, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5350, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2247, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5030, 0, 275, 0, 0, 0, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 4995, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 4678, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4509, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 4507, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 3721, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 3338, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 3715, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 4496, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 2497, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 2499, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 0, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 4443, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 3483, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4301, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 4142, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4070, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3938, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 1907, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 2499, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 3763, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3732, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 3632, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3613, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 3490, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3452, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2802, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 3317, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3265, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 3263, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3052, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 2432, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 1468, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 2656, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 2584, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 1950, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1230, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 832, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 1233, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 970, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 969, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 4999, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 579, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 4073, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 2497, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 2499, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 539, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 751, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 0, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 2413, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 759, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 1886, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 542, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 1884, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 763, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 353, 354, 355, 356, 357, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 518, 0, 0, 662, 696, + 685, 774, 649, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 412, 0, 0, 481, 700, 681, 692, + 682, 524, 667, 668, 669, 676, 424, 670, 807, 672, + 641, 673, 642, 674, 675, 0, 699, 648, 560, 500, + 0, 716, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, + 383, 276, 643, 770, 645, 644, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 561, 589, 0, 602, + 0, 450, 451, 0, 0, 0, 0, 0, 0, 0, + 368, 568, 586, 384, 555, 600, 389, 563, 1787, 379, + 517, 551, 0, 0, 370, 584, 562, 495, 369, 0, + 544, 409, 426, 406, 515, 0, 0, 583, 613, 405, + 603, 0, 594, 372, 0, 593, 514, 487, 580, 585, + 496, 489, 0, 371, 582, 494, 488, 464, 416, 629, + 465, 466, 467, 468, 469, 470, 430, 530, 485, 531, + 431, 502, 501, 503, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 0, 0, 0, 0, 0, 624, + 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 762, 0, 0, 767, + 0, 596, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 471, 0, 0, 0, 614, 0, 547, 520, 809, + 0, 0, 545, 483, 581, 532, 587, 569, 595, 539, + 533, 362, 570, 408, 497, 380, 382, 796, 410, 413, + 417, 418, 508, 509, 526, 554, 573, 574, 575, 407, + 394, 546, 395, 427, 396, 363, 399, 398, 400, 556, + 401, 365, 527, 578, 0, 423, 542, 492, 366, 491, + 528, 577, 576, 381, 604, 611, 612, 704, 0, 617, + 810, 811, 812, 626, 0, 534, 377, 374, 0, 0, + 0, 403, 529, 390, 392, 393, 391, 523, 525, 631, + 632, 633, 635, 636, 637, 638, 0, 0, 0, 0, + 639, 705, 723, 689, 658, 619, 713, 655, 659, 660, + 444, 445, 446, 447, 726, 0, 0, 0, 610, 472, + 473, 0, 415, 414, 493, 367, 0, 0, 461, 443, + 535, 373, 411, 463, 449, 474, 475, 476, 477, 478, + 0, 479, 480, 421, 352, 358, 804, 404, 516, 728, + 765, 766, 650, 0, 714, 651, 661, 397, 686, 698, + 697, 510, 609, 0, 709, 712, 640, 803, 0, 706, + 720, 808, 719, 800, 522, 0, 553, 717, 664, 0, + 710, 683, 684, 0, 711, 679, 715, 0, 652, 0, + 620, 623, 654, 741, 742, 743, 364, 622, 745, 746, + 747, 748, 749, 750, 751, 744, 592, 687, 663, 690, + 601, 666, 665, 0, 0, 701, 618, 702, 703, 504, + 505, 506, 507, 425, 729, 388, 621, 537, 538, 0, + 688, 0, 0, 0, 0, 0, 0, 0, 0, 693, + 694, 691, 813, 0, 752, 753, 0, 0, 615, 616, + 420, 0, 634, 428, 387, 521, 422, 599, 452, 0, + 627, 695, 628, 540, 541, 756, 761, 757, 758, 760, + 781, 511, 442, 448, 557, 462, 484, 543, 598, 519, + 548, 385, 588, 559, 490, 680, 708, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 737, 736, 735, 734, 733, 732, + 731, 730, 0, 0, 677, 402, 801, 795, 802, 782, + 785, 784, 759, 0, 359, 657, 482, 536, 419, 724, + 725, 0, 780, 292, 293, 294, 295, 296, 297, 298, + 299, 340, 300, 301, 302, 303, 304, 305, 306, 311, + 312, 313, 314, 315, 316, 317, 318, 727, 309, 310, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 0, 0, 0, 0, 341, 786, + 787, 788, 789, 790, 0, 0, 342, 343, 344, 0, + 0, 307, 308, 335, 567, 336, 337, 338, 339, 0, + 0, 605, 606, 607, 630, 0, 608, 590, 656, 429, + 360, 571, 597, 798, 799, 0, 0, 0, 0, 0, + 0, 0, 707, 718, 754, 755, 0, 768, 769, 771, + 773, 772, 775, 564, 565, 783, 0, 0, 453, 375, + 376, 512, 513, 550, 0, 454, 455, 456, 460, 457, + 458, 459, 777, 778, 779, 776, 486, 549, 572, 558, + 797, 499, 347, 794, 348, 349, 350, 351, 0, 805, + 646, 647, 806, 764, 763, 361, 0, 345, 346, 721, + 722, 0, 0, 552, 498, 653, 353, 354, 355, 356, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 662, 696, 685, 774, 649, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, + 0, 0, 481, 700, 681, 692, 682, 524, 667, 668, + 669, 676, 424, 670, 807, 672, 641, 673, 642, 674, + 675, 0, 699, 648, 560, 500, 0, 716, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, + 0, 0, 0, 0, 0, 0, 383, 276, 643, 770, + 645, 644, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 561, 589, 0, 602, 0, 450, 451, 0, + 0, 0, 0, 0, 0, 0, 368, 568, 586, 384, + 555, 600, 389, 563, 579, 379, 517, 551, 0, 0, + 370, 584, 562, 495, 369, 0, 544, 409, 426, 406, + 515, 0, 0, 583, 613, 405, 603, 0, 594, 372, + 0, 593, 514, 487, 580, 585, 496, 489, 0, 371, + 582, 494, 488, 464, 416, 629, 465, 466, 467, 468, + 469, 470, 430, 530, 485, 531, 431, 502, 501, 503, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 0, 0, 0, 0, 0, 624, 625, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 762, 0, 0, 767, 0, 596, 0, 0, + 0, 0, 0, 0, 566, 0, 0, 471, 0, 0, + 0, 614, 0, 547, 520, 809, 0, 0, 545, 483, + 581, 532, 587, 569, 595, 921, 533, 362, 570, 408, + 497, 380, 382, 796, 410, 413, 417, 418, 508, 509, + 526, 554, 573, 574, 575, 407, 394, 546, 395, 427, + 396, 363, 399, 398, 400, 556, 401, 365, 527, 578, + 0, 423, 542, 492, 366, 491, 528, 577, 576, 381, + 604, 611, 612, 704, 0, 617, 810, 811, 812, 626, + 0, 534, 377, 374, 0, 0, 0, 403, 529, 390, + 392, 393, 391, 523, 525, 631, 632, 633, 635, 636, + 637, 638, 0, 0, 0, 0, 639, 705, 723, 689, + 658, 619, 713, 655, 659, 660, 444, 445, 446, 447, + 726, 0, 0, 0, 610, 472, 473, 0, 415, 414, + 493, 367, 0, 0, 461, 443, 535, 373, 411, 463, + 449, 474, 475, 476, 477, 478, 0, 479, 480, 421, + 352, 358, 804, 404, 516, 728, 765, 766, 650, 0, + 714, 651, 661, 397, 686, 698, 697, 510, 609, 0, + 709, 712, 640, 803, 0, 706, 720, 808, 719, 800, + 522, 0, 553, 717, 664, 0, 710, 683, 684, 0, + 711, 679, 715, 0, 652, 0, 620, 623, 654, 741, + 742, 743, 364, 622, 745, 746, 747, 748, 749, 750, + 922, 744, 592, 687, 663, 690, 601, 666, 665, 0, + 0, 701, 618, 702, 703, 504, 505, 506, 507, 425, + 729, 388, 621, 537, 538, 0, 688, 0, 0, 0, + 0, 0, 0, 0, 0, 693, 694, 691, 813, 0, + 752, 753, 0, 0, 615, 616, 420, 0, 634, 428, + 387, 521, 422, 599, 452, 0, 627, 695, 628, 540, + 541, 756, 761, 757, 758, 760, 781, 511, 442, 448, + 557, 462, 484, 543, 598, 519, 548, 385, 588, 559, + 490, 680, 708, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 333, 334, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 737, 736, 735, 734, 733, 732, 731, 730, 0, 0, + 677, 402, 801, 795, 802, 782, 785, 784, 759, 0, + 359, 657, 482, 536, 419, 724, 725, 0, 780, 292, + 293, 294, 295, 296, 297, 298, 299, 340, 300, 301, + 302, 303, 304, 305, 306, 311, 312, 313, 314, 315, + 316, 317, 318, 727, 309, 310, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 0, 0, 0, 0, 341, 786, 787, 788, 789, 790, + 0, 0, 342, 343, 344, 0, 0, 307, 308, 335, + 567, 336, 337, 338, 339, 0, 0, 605, 606, 607, + 630, 0, 608, 590, 656, 429, 360, 571, 597, 798, + 799, 0, 0, 0, 0, 0, 0, 0, 707, 718, + 754, 755, 0, 768, 769, 771, 773, 772, 775, 564, + 565, 783, 0, 0, 453, 375, 376, 512, 513, 550, + 0, 454, 455, 456, 460, 457, 458, 459, 777, 778, + 779, 776, 486, 549, 572, 558, 797, 499, 347, 794, + 348, 349, 350, 351, 0, 805, 646, 647, 806, 764, + 763, 361, 0, 345, 346, 721, 722, 0, 0, 552, + 498, 653, 353, 354, 355, 356, 357, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 518, 0, 0, + 662, 696, 685, 774, 649, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 412, 0, 0, 481, 700, + 681, 692, 682, 524, 667, 668, 669, 676, 424, 670, + 807, 672, 641, 673, 642, 674, 675, 0, 699, 648, + 560, 500, 0, 716, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 383, 276, 643, 770, 645, 644, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 561, 589, + 0, 602, 0, 450, 451, 0, 0, 0, 0, 0, + 0, 0, 368, 568, 586, 384, 555, 600, 389, 563, + 579, 379, 517, 551, 0, 0, 370, 584, 562, 495, + 369, 0, 544, 409, 426, 406, 515, 0, 0, 583, + 613, 405, 603, 0, 594, 372, 0, 593, 514, 487, + 580, 585, 496, 489, 0, 371, 582, 494, 488, 464, + 416, 629, 465, 466, 467, 468, 469, 470, 430, 530, + 485, 531, 431, 502, 501, 503, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 0, 0, 0, 0, + 0, 624, 625, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 762, 0, + 0, 767, 0, 596, 0, 0, 0, 0, 0, 0, + 566, 0, 0, 471, 0, 0, 0, 614, 0, 547, + 520, 809, 0, 0, 545, 483, 581, 532, 587, 569, + 595, 539, 533, 362, 570, 408, 497, 380, 382, 796, + 410, 413, 417, 418, 508, 509, 526, 554, 573, 574, + 575, 407, 394, 546, 395, 427, 396, 363, 399, 398, + 400, 556, 401, 365, 527, 578, 0, 423, 542, 492, + 366, 491, 528, 577, 576, 381, 604, 611, 612, 704, + 0, 617, 810, 811, 812, 626, 0, 534, 377, 374, + 0, 0, 0, 403, 529, 390, 392, 393, 391, 523, + 525, 631, 632, 633, 635, 636, 637, 638, 0, 0, + 0, 0, 639, 705, 723, 689, 658, 619, 713, 655, + 659, 660, 444, 445, 446, 447, 726, 0, 0, 0, + 610, 472, 473, 0, 415, 414, 493, 367, 0, 0, + 461, 443, 535, 373, 411, 463, 449, 474, 475, 476, + 477, 478, 0, 479, 480, 421, 352, 358, 804, 404, + 516, 728, 765, 766, 650, 0, 714, 651, 661, 397, + 686, 698, 697, 510, 609, 0, 709, 712, 640, 803, + 0, 706, 720, 808, 719, 800, 522, 0, 553, 717, + 664, 0, 710, 683, 684, 0, 711, 679, 715, 0, + 652, 0, 620, 623, 654, 741, 742, 743, 364, 622, + 745, 746, 747, 748, 749, 750, 751, 744, 592, 687, + 663, 690, 601, 666, 665, 0, 0, 701, 618, 702, + 703, 504, 505, 506, 507, 425, 729, 388, 621, 537, + 538, 0, 688, 0, 0, 0, 0, 0, 0, 0, + 0, 693, 694, 691, 813, 0, 752, 753, 0, 0, + 615, 616, 420, 0, 634, 428, 387, 521, 422, 599, + 452, 0, 627, 695, 628, 540, 541, 756, 761, 757, + 758, 760, 781, 511, 442, 448, 557, 462, 484, 543, + 598, 519, 548, 385, 588, 559, 490, 680, 708, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 333, 334, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 737, 736, 735, 734, + 733, 732, 731, 730, 0, 0, 677, 402, 801, 795, + 802, 782, 785, 784, 856, 0, 359, 657, 482, 536, + 419, 724, 725, 0, 780, 292, 293, 294, 295, 296, + 297, 298, 299, 340, 300, 301, 302, 303, 304, 305, + 306, 311, 312, 313, 314, 315, 316, 317, 318, 727, + 309, 310, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 0, 0, 0, 0, + 341, 786, 787, 788, 789, 790, 0, 0, 342, 343, + 344, 0, 0, 307, 308, 335, 567, 336, 337, 338, + 339, 0, 0, 605, 606, 607, 630, 0, 608, 590, + 656, 429, 360, 571, 597, 798, 799, 0, 0, 0, + 0, 0, 0, 0, 707, 718, 754, 755, 0, 768, + 769, 771, 773, 772, 775, 564, 565, 783, 0, 0, + 453, 375, 376, 512, 513, 550, 0, 454, 455, 456, + 460, 457, 458, 459, 777, 778, 779, 776, 486, 549, + 572, 558, 797, 499, 347, 794, 348, 349, 350, 351, + 0, 805, 646, 647, 806, 764, 763, 361, 0, 345, + 346, 721, 722, 0, 0, 552, 498, 653, 353, 354, + 355, 356, 357, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 518, 0, 0, 662, 696, 685, 774, + 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 481, 700, 681, 692, 682, 524, + 667, 668, 669, 676, 424, 670, 807, 672, 641, 673, + 642, 674, 675, 0, 699, 648, 560, 500, 0, 716, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 275, 0, 0, 0, 0, 0, 0, 383, 276, + 643, 770, 645, 644, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 561, 589, 0, 602, 0, 450, + 451, 0, 0, 0, 0, 0, 0, 0, 368, 568, + 586, 384, 555, 600, 389, 563, 579, 379, 517, 551, + 0, 0, 370, 584, 562, 495, 369, 0, 544, 409, + 426, 406, 515, 0, 0, 583, 613, 405, 603, 0, + 594, 372, 0, 593, 514, 487, 580, 585, 496, 489, + 0, 371, 582, 494, 488, 464, 416, 629, 465, 466, + 467, 468, 469, 470, 430, 530, 485, 531, 431, 502, + 501, 503, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 0, 0, 0, 0, 0, 624, 625, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 762, 0, 0, 767, 0, 596, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 471, + 0, 0, 0, 614, 0, 547, 520, 809, 0, 0, + 545, 483, 581, 532, 587, 569, 595, 539, 533, 362, + 570, 408, 497, 380, 382, 796, 410, 413, 417, 418, + 508, 509, 526, 554, 573, 574, 575, 407, 394, 546, + 395, 427, 396, 363, 399, 398, 400, 556, 401, 365, + 527, 578, 0, 423, 0, 492, 366, 491, 528, 577, + 576, 381, 604, 611, 612, 704, 0, 617, 810, 811, + 812, 626, 0, 534, 377, 374, 0, 0, 0, 403, + 529, 390, 392, 393, 391, 523, 525, 631, 632, 633, + 635, 636, 637, 638, 0, 0, 0, 0, 639, 705, + 723, 689, 658, 619, 713, 655, 659, 660, 444, 445, + 446, 447, 726, 0, 0, 0, 610, 472, 473, 0, + 415, 414, 493, 367, 0, 0, 461, 443, 535, 373, + 411, 463, 449, 474, 475, 476, 477, 478, 0, 479, + 480, 421, 352, 358, 804, 404, 516, 728, 765, 766, + 650, 0, 714, 651, 661, 397, 686, 698, 697, 510, + 609, 0, 709, 712, 640, 803, 0, 706, 720, 808, + 719, 800, 522, 0, 553, 717, 664, 0, 710, 683, + 684, 0, 711, 679, 715, 0, 652, 0, 620, 623, + 654, 741, 742, 743, 364, 622, 745, 746, 747, 748, + 749, 750, 751, 744, 592, 687, 663, 690, 601, 666, + 665, 0, 0, 701, 618, 702, 703, 504, 505, 506, + 507, 425, 729, 388, 621, 537, 538, 0, 688, 0, + 0, 0, 0, 0, 0, 0, 0, 693, 694, 691, + 813, 0, 752, 753, 0, 0, 615, 616, 420, 0, + 634, 428, 387, 521, 422, 599, 452, 0, 627, 695, + 628, 540, 541, 756, 761, 757, 758, 760, 781, 511, + 442, 448, 557, 462, 484, 543, 598, 519, 548, 385, + 588, 559, 490, 680, 708, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 737, 736, 735, 734, 733, 732, 731, 730, + 0, 0, 677, 402, 801, 795, 802, 782, 785, 784, + 759, 0, 359, 657, 482, 536, 419, 724, 725, 0, + 780, 292, 293, 294, 295, 296, 297, 298, 299, 340, + 300, 301, 302, 303, 304, 305, 306, 311, 312, 313, + 314, 315, 316, 317, 318, 727, 309, 310, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 0, 0, 0, 0, 341, 786, 787, 788, + 789, 790, 0, 0, 342, 343, 344, 0, 0, 307, + 308, 335, 567, 336, 337, 338, 339, 0, 0, 605, + 606, 607, 630, 0, 608, 590, 656, 429, 360, 571, + 597, 798, 799, 0, 0, 0, 0, 0, 0, 0, + 707, 718, 754, 755, 0, 768, 769, 771, 773, 772, + 775, 564, 565, 783, 0, 0, 453, 375, 376, 512, + 513, 550, 0, 454, 455, 456, 460, 457, 458, 459, + 777, 778, 779, 776, 486, 549, 572, 558, 797, 499, + 347, 794, 348, 349, 350, 351, 0, 805, 646, 647, + 806, 764, 763, 361, 0, 345, 346, 721, 722, 0, + 0, 552, 498, 653, 353, 354, 355, 356, 357, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 518, + 0, 0, 662, 696, 685, 774, 649, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, + 481, 700, 681, 692, 682, 524, 667, 668, 669, 676, + 424, 670, 807, 672, 641, 673, 642, 674, 675, 0, + 699, 648, 560, 500, 0, 716, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, + 0, 0, 0, 0, 383, 276, 643, 770, 645, 644, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 561, 589, 0, 602, 0, 450, 451, 0, 0, 0, + 0, 0, 0, 0, 368, 568, 586, 384, 555, 600, + 389, 563, 579, 379, 517, 551, 0, 0, 370, 584, + 562, 495, 369, 0, 544, 409, 426, 406, 515, 0, + 0, 583, 613, 405, 603, 0, 594, 372, 0, 593, + 514, 487, 580, 585, 496, 489, 0, 371, 582, 494, + 488, 464, 416, 629, 465, 466, 467, 468, 469, 470, + 430, 530, 485, 531, 431, 502, 501, 503, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 0, 0, + 0, 0, 0, 624, 625, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 762, 0, 0, 767, 0, 596, 0, 0, 0, 0, + 0, 0, 566, 0, 0, 471, 0, 0, 0, 614, + 0, 547, 520, 809, 0, 0, 545, 483, 581, 532, + 587, 569, 595, 539, 533, 362, 570, 408, 497, 380, + 382, 796, 410, 413, 417, 418, 508, 509, 526, 554, + 573, 574, 575, 407, 394, 546, 395, 427, 396, 363, + 399, 398, 400, 556, 401, 365, 527, 578, 0, 423, + 542, 492, 366, 491, 528, 577, 576, 381, 604, 611, + 612, 704, 0, 617, 810, 811, 812, 626, 0, 534, + 377, 374, 0, 0, 0, 403, 529, 390, 392, 393, + 391, 523, 525, 631, 632, 633, 635, 636, 637, 638, + 0, 0, 0, 0, 639, 705, 723, 689, 658, 619, + 713, 655, 659, 660, 444, 445, 446, 447, 726, 0, + 0, 0, 610, 472, 473, 0, 415, 414, 493, 367, + 0, 0, 461, 443, 535, 373, 411, 463, 449, 474, + 475, 476, 477, 478, 0, 479, 480, 421, 352, 358, + 804, 404, 516, 728, 765, 766, 650, 0, 714, 651, + 661, 397, 686, 698, 697, 510, 609, 0, 709, 712, + 640, 803, 0, 706, 720, 808, 719, 800, 522, 0, + 553, 717, 664, 0, 710, 683, 684, 0, 711, 679, + 715, 0, 652, 0, 620, 623, 654, 741, 742, 743, + 364, 622, 745, 746, 747, 748, 749, 750, 751, 744, + 592, 687, 663, 690, 601, 666, 665, 0, 0, 701, + 618, 702, 703, 504, 505, 506, 507, 425, 729, 388, + 621, 537, 538, 0, 688, 0, 0, 0, 0, 0, + 0, 0, 0, 693, 694, 691, 813, 0, 752, 753, + 0, 0, 615, 616, 420, 0, 634, 428, 387, 521, + 422, 599, 452, 0, 627, 695, 628, 540, 541, 756, + 761, 757, 758, 760, 781, 511, 442, 448, 557, 462, + 484, 543, 598, 519, 548, 385, 588, 559, 490, 680, + 708, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 333, 334, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 737, 736, + 735, 734, 733, 732, 731, 730, 0, 0, 677, 402, + 801, 795, 802, 782, 785, 784, 759, 0, 359, 657, + 482, 536, 419, 724, 725, 0, 780, 292, 293, 294, + 295, 296, 297, 298, 299, 340, 300, 301, 302, 303, + 304, 305, 306, 311, 312, 313, 314, 315, 316, 317, + 318, 727, 309, 310, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 0, 0, + 0, 0, 341, 786, 787, 788, 789, 790, 0, 0, + 342, 343, 344, 0, 0, 307, 308, 335, 567, 336, + 337, 338, 339, 0, 0, 605, 606, 607, 630, 0, + 608, 590, 656, 429, 360, 571, 597, 798, 799, 0, + 0, 0, 0, 0, 0, 0, 707, 718, 754, 755, + 0, 768, 769, 771, 773, 772, 775, 564, 565, 783, + 0, 0, 453, 375, 376, 512, 513, 550, 0, 454, + 455, 456, 460, 457, 458, 459, 777, 778, 779, 776, + 486, 549, 572, 558, 797, 499, 347, 794, 348, 349, + 350, 351, 0, 805, 646, 647, 806, 764, 0, 361, + 0, 345, 346, 721, 722, 0, 0, 552, 498, 653, + 943, 942, 949, 939, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 946, 947, 0, 948, 952, 0, 0, + 933, 943, 942, 949, 939, 0, 0, 0, 0, 0, + 957, 0, 0, 0, 946, 947, 0, 948, 952, 0, + 0, 933, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 961, 0, + 0, 963, 0, 0, 0, 0, 962, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 961, + 0, 0, 963, 0, 0, 0, 0, 962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -11262,13 +11337,15 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 919, 921, 920, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 926, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 930, 0, - 0, 0, 0, 0, 0, 945, 0, 0, 0, 0, - 0, 0, 923, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 934, 936, 935, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 941, 0, 0, 0, 0, + 0, 0, 0, 0, 934, 936, 935, 945, 0, 0, + 0, 0, 0, 0, 960, 0, 941, 0, 0, 0, + 0, 938, 0, 0, 0, 928, 0, 0, 945, 0, + 0, 0, 0, 0, 0, 960, 0, 0, 0, 0, + 0, 0, 938, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -11281,9 +11358,11 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 925, 929, 935, - 0, 936, 938, 0, 0, 939, 940, 941, 0, 0, - 0, 943, 944, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 940, 944, 950, 0, + 951, 953, 0, 0, 954, 955, 956, 0, 0, 0, + 958, 959, 0, 0, 0, 0, 0, 940, 944, 950, + 0, 951, 953, 0, 0, 954, 955, 956, 0, 0, + 0, 958, 959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -11296,54 +11375,58 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 937, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 922, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 964, 965, 966, 967, 968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 949, 950, 951, 952, 953, + 0, 0, 0, 0, 0, 964, 965, 966, 967, 968, } var yyPact = [...]int{ - 6984, -1000, -1000, -356, -1000, -1000, -1000, -1000, -1000, 21448, + 7455, -1000, -1000, -341, -1000, -1000, -1000, -1000, -1000, 21575, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 80532, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 736, 80532, 1451, -298, -1000, 4209, + -1000, 1625, -1000, -1000, -1000, -1000, 546, 78174, 23147, -1000, + 80532, 946, 935, 87606, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 79955, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 736, 79955, 1378, -329, -1000, 4196, -1000, 1439, - -1000, -1000, -1000, -1000, 592, 77615, 23008, -1000, 79955, 934, - 929, 86975, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 7909, -271, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1456, 1453, -1000, 86820, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1259, + 89949, 79746, 16847, 4164, -112, -1000, -1000, 2572, 97, 3920, + 900, 165, 162, 923, 1742, 1756, 1968, 1779, 80532, 1725, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 7620, 36515, 78960, 1619, 4700, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1386, 1383, 7545, -1000, 86195, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 1230, 6107, 79175, 16756, 4040, - -93, -1000, -1000, 2340, 123, 3905, 743, 172, 170, 916, - 1719, 1726, 2039, 1558, 79955, 1672, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 8008, - 36274, 78395, 1608, 4626, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1010, 1452, 1619, + 31013, 359, 353, 2447, 4961, 2299, -1000, -1000, 82, 7198, + -1000, -1000, 2055, 80532, 7455, 315, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 16847, 16847, 21575, + -390, 21575, 16847, 80532, 80532, -1000, -1000, -1000, -1000, 1451, + -298, 78174, -271, 1259, 89949, 16847, 4164, 3920, 900, 165, + 162, 923, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 820, 1381, 1608, 30814, 382, 379, 2683, 4857, 2142, - -1000, -1000, 53, 7950, -1000, -1000, 2281, 79955, 6984, 294, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 16756, 16756, 21448, -419, 21448, 16756, 79955, 79955, -1000, - -1000, -1000, -1000, 1378, -329, 77615, 1230, 6107, 16756, 4040, - 3905, 743, 172, 170, 916, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 82, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 53, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -11362,17 +11445,17 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 353, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 379, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 4700, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 4626, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -11382,561 +11465,563 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 7169, -1000, 2676, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 3597, 4447, 2668, 80532, 3917, -1000, + -1000, -1000, -1000, -1000, -1000, 2447, 4889, 77388, -1000, -1000, + 4928, -1000, 80532, 242, 80532, 473, 2934, 2187, 2310, -1000, + 1335, 1966, 626, 2664, -1000, -1000, -1000, -1000, -1000, -1000, + 4254, 1156, 4924, -1000, 80532, 80532, 80532, 4473, 585, 4828, + -1000, 263, -8, -245, -263, 4535, 2765, 2765, 4893, 4893, + 4827, 4810, 1200, 1198, 1194, 2765, 1007, -1000, 2952, 2952, + 2952, 2952, 2765, 789, 1210, 4833, 4446, 4833, 298, 2952, + 317, 2765, 2765, 317, 2765, 2765, 791, -1000, 2851, 856, + 209, -187, 202, -1000, -1000, -1000, 2952, 2952, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 4778, 4777, 1399, 80532, 80532, + -1000, 689, 1191, -1000, 89970, 4710, 2209, 1381, 4531, -1000, + -1000, 4445, -1000, 637, 784, 630, 833, 728, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 580, -1000, 4784, -1000, -1000, + 609, -1000, -1000, 584, -1000, -1000, -1000, 351, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 205, + 80532, -1000, -1000, 1849, 3153, 16847, 3165, -1000, 776, 2770, + -1000, -1000, -1000, 8967, 20787, 20787, 20787, 20787, 20787, 80532, + -1000, -1000, 4307, 16847, 4444, 4439, 4438, 4437, -1000, -1000, + -1000, -1000, -1000, -1000, 4435, 2625, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 3147, -1000, -1000, -1000, 19999, + -1000, 4434, 4430, 4429, 4428, 4426, 4423, 4421, 4419, 4418, + 4417, 4416, 4413, 4411, 4309, 4410, 4223, 23933, 4409, 3915, + 3914, 4408, 4407, 4406, 3911, 4405, 4404, 4403, 4223, 4223, + 4402, 4398, 4397, 4396, 4394, 4392, 4390, 4388, 4386, 4383, + 4382, 4379, 4378, 4376, 4375, 4373, 4371, 4370, 4369, 4367, + 4365, 4364, 4361, 4354, 4353, 4352, 4351, 4350, 4346, 4345, + 4344, 4343, 4341, 4336, 4335, 4334, 4333, 4332, 4327, 4326, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 6478, - -1000, 2530, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 3560, 4386, 2528, 79955, 3903, -1000, -1000, -1000, -1000, - -1000, -1000, 2683, 4749, 76835, -1000, -1000, 4836, -1000, 79955, - 225, 79955, 494, 2943, 2523, 763, -1000, 1404, 2604, 634, - 2527, -1000, -1000, -1000, -1000, -1000, -1000, 4024, 1090, 4835, - -1000, 79955, 79955, 79955, 4402, 79955, 79955, 613, 4744, -1000, - 209, -73, -297, -314, 4425, 2781, 2781, 4791, 4791, 4742, - 4741, 1165, 1156, 1101, 2781, 994, -1000, 2748, 2748, 2748, - 2748, 2781, 738, 1160, 4751, 4385, 4751, 287, 2748, 277, - 2781, 2781, 277, 2781, 2781, 809, -1000, 2824, 817, 526, - -208, -1000, -1000, -1000, 2748, 2748, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 4712, 4711, -1000, 582, 1149, -1000, 89300, - 4645, 2275, 1366, 4424, -1000, -1000, 4384, -1000, 647, 824, - 514, 1045, 734, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 553, -1000, 4719, -1000, -1000, 629, -1000, -1000, 602, -1000, - -1000, -1000, 316, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 107, 79955, -1000, -1000, 1815, 3035, - 16756, 3289, -1000, 428, 2753, -1000, -1000, -1000, 8936, 20666, - 20666, 20666, 20666, 20666, 79955, -1000, -1000, 4240, 16756, 4383, - 4379, 4378, 4377, -1000, -1000, -1000, -1000, -1000, -1000, 4374, - 2526, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 3110, -1000, -1000, -1000, 19884, -1000, 4373, 4372, 4371, 4369, - 4366, 4365, 4364, 4363, 4362, 4361, 4360, 4358, 4354, 4242, - 4349, 4153, 23788, 4348, 3900, 3899, 4347, 4346, 4345, 3898, - 4343, 4342, 4340, 4153, 4153, 4339, 4338, 4336, 4334, 4333, - 4332, 4330, 4329, 4328, 4326, 4325, 4324, 4321, 4318, 4310, - 4309, 4308, 4306, 4305, 4304, 4303, 4302, 4300, 4297, 4296, - 4294, 4293, 4292, 4291, 4290, 4289, 4288, 4287, 4286, 4285, - 4284, 4276, 4275, 4266, 4263, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2447, 4233, 4976, + 2134, -1000, 4325, 4967, 4876, 4831, 1917, 16847, -177, 4761, + 4759, 4752, 4746, 4324, 3522, -1000, -1000, 220, 80532, 80532, + 400, 80532, -196, 585, 819, 65, 12, 812, 11, 1650, + -1000, 806, -1000, -1000, 1718, -1000, 1713, 86034, 1371, -1000, + -1000, 80532, 1257, 1257, 1257, -214, 471, 1257, 80532, 826, + 1397, 1423, 1543, 1257, 1257, 1257, 1257, 1403, 1257, 1450, + 1449, 1447, 1257, 122, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 2932, 2928, 4625, 3086, 2978, 1229, 77388, 77388, + 80532, -1000, 2331, 80532, -1000, 4289, 1645, -1000, -1000, -1000, + -1000, 44376, -215, 467, 1259, 1259, 80532, 1259, 80532, 695, + 415, 35729, 1259, 1393, 1259, 1259, 80532, 1271, -262, 252, + 85248, 84462, 3889, 689, 1173, 1168, 2225, 2919, -1000, 2795, + 80532, 80532, 2795, 2795, 34943, 34157, -1000, 80532, -1000, 4967, + 1917, -1000, 4804, 1930, -1000, 4880, 4199, 2584, 4961, 4961, + 4233, -1000, -112, -1, 1259, 1259, -216, 465, 1259, 1259, + 1259, 1259, 1259, 1445, 1259, 1259, 1259, 80532, 1259, 76602, + 1391, 1259, 808, 1259, 1259, 1259, 13695, 2055, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 21575, 3083, 3149, 314, 94, -266, 445, -1000, + -1000, 80532, 4680, 2698, -1000, -1000, -1000, 4273, 4266, -1000, + 4271, 4271, 4271, 4271, 1663, -1000, 4266, -1000, -1000, -1000, + 4266, -1000, -1000, -1000, -1000, 4271, 4271, 4271, 4271, 4271, + 4271, 4269, 4322, -1000, -1000, 4267, 4267, 4267, 4266, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 2683, 4205, 4881, 2048, -1000, 4257, 4872, 4778, - 4747, 1849, 16756, -197, 4699, 4696, 4690, 4688, 4251, 3485, - -1000, -1000, 182, 79955, 79955, 381, 79955, -238, 613, 828, - 31, 30, 827, 29, 1514, -1000, 747, -1000, -1000, 1699, - -1000, 1605, 85415, 1331, -1000, -1000, 79955, 1228, 1228, 1228, - -260, 492, 1228, 79955, 830, 1349, 1538, 1228, 1228, 1228, - 1228, 1337, 1228, 1376, 1374, 1367, 1228, 88, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 2940, 2939, 4531, 3064, - 2989, 1201, 76835, 76835, 79955, -1000, 2358, 79955, -1000, 4227, - 1569, -1000, -1000, -1000, -1000, 44075, -262, 488, 1230, 1230, - 79955, 1230, 79955, 663, 387, 35494, 1230, 1230, 1230, 79955, - 1242, -312, 248, 84635, 83855, 3612, 582, 1143, 1139, 2206, - 2843, -1000, 2711, 79955, 79955, 2711, 2711, 34714, 33934, -1000, - 79955, -1000, 4872, 1849, -1000, 4737, 2004, -1000, 4782, 4130, - 2306, 4857, 4857, 4205, -1000, -93, 28, 1230, 1230, -267, - 481, 1230, 1230, 1230, 1230, 1230, 1365, 1230, 1230, 1230, - 79955, 1230, 76055, 1230, 822, 1230, 1230, 1230, 13628, 2281, + -1000, -1000, -1000, -1000, 1804, 4263, 4264, 4264, 4263, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 21448, 3061, 3102, 292, 74, -302, - 508, -1000, -1000, 79955, 4608, 2597, -1000, -1000, -1000, 4212, - 4208, -1000, 4211, 4211, 4211, 4211, 1667, -1000, 4208, -1000, - -1000, -1000, 4208, -1000, -1000, -1000, -1000, 4211, 4211, 4211, - 4211, 4211, 4211, 4210, 4250, -1000, -1000, 4209, 4209, 4209, - 4208, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 1649, 4206, 4207, 4207, - 4206, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 79955, - 4868, -1000, -1000, 16756, 79955, 1322, 4625, 4872, 4629, 4751, - 4778, 1190, 3211, -1000, -281, 79955, 452, -1000, 2522, 3483, - 1799, 2935, -1000, 1854, 634, 2928, -1000, 896, 896, -1000, - 634, 2737, -1000, 2057, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 79955, 107, 5514, -1000, -1000, -1000, 3845, 995, -1000, - 4249, 905, -1000, -1000, -1000, -1000, 79955, 4751, 8, 4739, - 2781, 2972, 2924, 2781, -1000, -1000, -1000, 1117, 4791, 20666, - 20666, -1000, -1000, 16756, -1000, 482, 45635, 2748, 2781, 2781, - -1000, -1000, 79955, -1000, -1000, -1000, 2748, 79955, 2748, 2748, - 4791, 2748, -1000, -1000, -1000, 2781, 2781, -1000, -1000, 16756, - 2668, -1000, -1000, 2748, 2748, -1000, -1000, 4791, 79955, 290, - 4791, 4791, 262, -1000, -1000, 79955, -1000, 2781, 3886, -1000, - 79955, 79955, 1228, 79955, -1000, 79955, 79955, -1000, -1000, -1000, - 987, 2195, 2115, -1000, 530, 7101, 63575, 582, 63575, 79955, - -1000, -1000, -1000, -1000, -1000, -1000, 284, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 80532, 4962, -1000, + -1000, 16847, 80532, 1367, 4699, 4967, 4703, 4833, 4876, 1224, + 3132, -1000, -227, 80532, 606, -1000, 2616, 3505, 2039, 2926, + -1000, 1434, 626, 2918, -1000, 1621, 1621, -1000, 626, 2755, + -1000, 1896, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 80532, + 205, 6275, -1000, -1000, -1000, 3859, -1000, -1000, -1000, 80532, + 4833, -17, 4809, 2765, 3000, 2999, 2765, -1000, -1000, -1000, + 1165, 4893, 20787, 20787, -1000, -1000, 16847, -1000, 506, 45948, + 2952, 2765, 2765, -1000, -1000, 80532, -1000, -1000, -1000, 2952, + 80532, 2952, 2952, 4893, 2952, -1000, -1000, -1000, 2765, 2765, + -1000, -1000, 16847, 2714, -1000, -1000, 2952, 2952, -1000, -1000, + 4893, 80532, 348, 4893, 4893, 310, -1000, -1000, 80532, -1000, + 2765, 3904, -1000, 80532, 80532, 1257, 80532, 1390, -1000, -1000, + -285, 80532, 80532, -1000, -1000, 80532, 994, -1000, 4318, 861, + -1000, -1000, 975, 2160, 2257, -1000, 520, 5560, 64026, 689, + 64026, 80532, -1000, -1000, -1000, -1000, -1000, -1000, 324, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 624, -1000, 4834, 16756, 16756, 16756, 16756, -1000, 1245, - 19102, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 20666, 20666, - 20666, 20666, 20666, 20666, 20666, 20666, 20666, 20666, 20666, 20666, - 20666, 20666, 4239, 2980, 2883, 4725, 20666, 20666, 20666, 20666, - 20666, 491, 38614, 2306, 4061, 2376, 527, 2662, 2662, 2662, - 2662, 2662, 16756, -1000, 2985, 3035, 16756, 16756, 16756, 16756, - 49535, 79955, -1000, -1000, 8936, 7074, 16756, 16756, 4900, 20666, - 16756, 4676, 16756, 16756, 16756, 4127, 9718, 79955, 16756, -1000, - 4126, 4125, -1000, -1000, 3189, 16756, -1000, -1000, 16756, -1000, - -1000, 16756, 20666, 16756, -1000, 16756, 16756, 16756, -1000, -1000, - 2073, 2073, 1520, 4676, 16756, 16756, 4676, 4676, 2901, 16756, - 16756, 4676, 4676, 4676, 2895, 4676, 4676, 4676, 4676, 4676, - 4676, 4676, 4015, 4676, 4676, 4676, 4676, 4676, 4119, 4117, - 4116, 4115, 16756, 4114, 16756, 16756, 16756, 16756, 16756, 15974, - 4872, 2683, 4737, -93, 14410, 4629, 4751, 4611, -67, 4778, - -1000, -1000, -1000, -1000, 3035, -202, 4248, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 79955, 3885, 3883, -364, -365, - 1680, -365, 2479, -1000, -239, 1707, 378, 79955, -1000, 3882, - 3481, 79955, 3879, 3480, 412, 406, 79955, 79955, 79955, 206, - 1717, 1611, 1664, -1000, -1000, 79955, 83075, -1000, 79955, 2707, - 79955, 79955, 1228, 1228, 79955, 4670, -1000, 79955, 79955, 1228, - 1228, -1000, 73715, 3878, 63575, 79955, 79955, 582, 79955, 79955, - 1228, 1228, 1228, 79955, -1000, 4563, 63575, 4536, 2184, 3023, - -1000, -1000, 79955, 16756, 3023, 1918, 4247, 1201, 1201, -1000, - 79955, 2358, 4669, 79955, 1242, -1000, 518, -1000, -1000, -1000, - -1000, 82295, 82295, 26129, 82295, -1000, 4246, 264, 79955, 79955, - 79955, 79955, 6002, 79955, 638, 4644, 1462, 73715, 75275, 2024, - 1787, -1000, -1000, 4710, 1531, 2761, 63575, 79955, 79955, 2350, - -1000, 1319, 30032, -1000, 79955, 2226, -1000, 202, -1000, 185, - 248, 2711, 248, 2711, 1317, -1000, 984, 670, 31594, 917, - 63575, 11282, -1000, -1000, 2711, 2711, 11282, 11282, 2607, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 2343, -1000, 487, 4737, + -1000, -1000, -1000, 618, -1000, 4923, 16847, 16847, 16847, 16847, + -1000, 1576, 19211, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 20787, 20787, 20787, 20787, 20787, 20787, 20787, 20787, 20787, 20787, + 20787, 20787, 20787, 20787, 4306, 3078, 3036, 4793, 20787, 20787, + 20787, 20787, 20787, 428, 38873, 2584, 4063, 2342, 493, 2712, + 2712, 2712, 2712, 2712, 16847, -1000, 2973, 3153, 16847, 16847, + 16847, 16847, 49878, 80532, -1000, -1000, 8967, 6846, 16847, 16847, + 6575, 20787, 16847, 4744, 16847, 16847, 16847, 4197, 9755, 80532, + 16847, -1000, 4196, 4194, -1000, -1000, 3320, 16847, -1000, -1000, + 16847, -1000, -1000, 16847, 20787, 16847, -1000, 16847, 16847, 16847, + -1000, -1000, 1955, 1955, 1626, 4744, 16847, 16847, 4744, 4744, + 2858, 16847, 16847, 4744, 4744, 4744, 2844, 4744, 4744, 4744, + 4744, 4744, 4744, 4744, 4124, 4744, 4744, 4744, 4744, 4744, + 4193, 4190, 4188, 4184, 16847, 4177, 16847, 16847, 16847, 16847, + 16847, 16059, 4967, 2447, 4804, -112, 14483, 4703, 4833, 4687, + -84, 4876, -1000, -1000, -1000, -1000, 3153, -182, 4316, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 80532, 3903, 3896, + -350, -355, 1674, -355, 2612, -1000, -197, 1736, 388, 80532, + -1000, 3895, 3504, 80532, 3894, 3499, 526, 525, 80532, 80532, + 80532, 247, 1740, 1721, 1723, -1000, -1000, 80532, 83676, -1000, + 80532, 2750, 80532, 80532, 1257, 1257, 80532, 4740, -1000, 80532, + 80532, 1257, 1257, 1257, -1000, 74244, 3893, 64026, 80532, 80532, + 689, 80532, 80532, 1257, 1257, 1257, 80532, -1000, 4634, 64026, + 4629, 2152, 2988, -1000, -1000, 80532, 16847, 2988, 1910, 4315, + 1229, 1229, -1000, 80532, 2331, 4739, 80532, 1271, -1000, 394, + -1000, -1000, -1000, -1000, 82890, 82890, 26292, 82890, -1000, 4313, + 308, 80532, 80532, 80532, 80532, 6334, 80532, 659, 4709, 1474, + 74244, 75816, 2338, 1884, -1000, -1000, 4776, 1681, 2832, 64026, + 80532, 80532, 80532, 2325, -1000, 1360, 30225, -1000, 80532, 2273, + -1000, 255, -1000, 240, 252, 2795, 252, 2795, 1346, -1000, + 966, 759, 31799, 893, 64026, 11331, -1000, -1000, 2795, 2795, + 11331, 11331, 2685, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 2318, -1000, 542, 4804, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -112, 16847, -1000, -1000, 4804, + 4804, 1917, 2263, 3498, 75030, 80532, 1259, 1259, 80532, 74244, + 64026, 689, 80532, 1259, 80532, 80532, 80532, -1000, 80532, -1000, + 4708, 1259, 80532, 1259, 80532, 80532, 80532, 2135, -1000, -1000, + 33371, 2577, -1000, -1000, 2987, -1000, 16847, 21575, -159, 16847, + 21575, 21575, 16847, 21575, -1000, 16847, 2297, -1000, -1000, 7632, + -1000, -1000, 3496, -1000, 3495, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3892, 3892, + -1000, 3494, -1000, -1000, -1000, -1000, 4263, 3491, -1000, -1000, + 3483, -1000, -1000, -1000, -1000, -34, 4175, 1849, -1000, 3887, + 3879, 4804, -1000, 4876, 494, 4876, 4687, 2244, 4310, 1259, + -1000, 325, -365, 2912, 2911, 2910, 4789, 80532, -1000, 1106, + 1621, -1000, -1000, 1957, -1000, 626, -1000, 1956, -1000, -1000, + -1000, 1621, 802, -1000, -1000, -1000, -1000, -1000, 2570, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -93, 16756, -1000, -1000, 4737, 4737, 1849, 2225, 3479, - 74495, 79955, 1230, 1230, 79955, 73715, 63575, 582, 79955, 1230, - 79955, 79955, 79955, -1000, 79955, -1000, 4643, 79955, 1230, 79955, - 79955, 79955, 2202, -1000, -1000, 33154, 2477, -1000, -1000, 3011, - -1000, 16756, 21448, -171, 16756, 21448, 21448, 16756, 21448, -1000, - 16756, 2487, -1000, -1000, 6620, -1000, -1000, 3477, -1000, 3476, + -1000, 31799, -1000, -1000, -1000, -1000, 1025, 8173, 81, 80, + 2314, -1000, -1000, -1000, 3482, 4834, 80532, 4893, 80532, -217, + 4893, 4893, 80532, -220, 4893, 689, -1000, 2770, 2770, 3153, + 80532, 80532, 80532, 4469, 4309, 80532, 277, 80532, 4893, 4893, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2952, 4893, 4893, + 2433, 4172, 2765, 2952, -1000, -1000, 2952, -365, -1000, 2952, + -1000, -1000, -1000, -365, 2558, -365, 80532, -1000, 80532, 80532, + -1000, -1000, -1000, -1000, 80532, -1000, 80532, -1000, 80532, -1000, + -29, -1000, -1000, 520, 64026, 70314, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 2327, -1000, -1000, -1000, 1340, 509, 2752, + -1000, -1000, 423, 321, 472, 1506, 3878, 3153, -1000, 3120, + 3030, -1000, 1209, 1103, -1000, -1000, -1000, -1000, 4307, -1000, + -1000, -1000, 4500, 3239, -1000, 2916, 2916, 2511, 2511, 2511, + 2511, 2511, 2930, 2930, 2770, 2770, -1000, -1000, -1000, 8967, + 4306, 20787, 20787, 20787, 20787, 4306, 20787, 20787, 20787, 20787, + 4305, -1000, 1480, 1480, 5461, 5918, 2712, -1000, -1000, 2682, + 2682, -1000, -1000, -1000, -1000, 16847, 266, 2977, -1000, 16847, + 3442, 2609, 3438, 2538, 2751, -1000, 4266, 16847, 2552, 724, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 3875, 3875, -1000, 3475, -1000, -1000, -1000, - -1000, 4206, 3465, -1000, -1000, 3463, -1000, -1000, -1000, -1000, - -9, 4111, 1815, -1000, 3862, 3860, 4737, -1000, 4778, 504, - 4778, 4611, 1970, 4245, 1230, -1000, 273, -377, 2918, 2915, - 2914, 4724, 79955, -1000, 1035, 896, -1000, -1000, 1797, -1000, - 634, -1000, 1796, -1000, -1000, -1000, 896, 765, -1000, -1000, - -1000, -1000, -1000, 2470, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 31594, -1000, -1000, -1000, - -1000, 1415, 7860, 51, 50, 2282, -1000, -1000, 79955, -1000, - 79955, -1000, 79955, -1000, -7, -1000, -1000, 3458, 4753, 79955, - 4791, 79955, -270, 4791, 4791, 79955, -266, 4791, 582, -1000, - 2753, 2753, 3035, 79955, 79955, 79955, 4400, 4242, 79955, 246, - 79955, 4791, 4791, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 2748, 4791, 4791, 2129, 4110, 2781, 2748, -1000, -1000, 2748, - -377, -1000, 2748, -1000, -1000, -1000, -377, 2468, -377, 79955, - -1000, -1000, -1000, -1000, -1000, 530, 63575, 69815, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 2336, -1000, -1000, -1000, 1316, - 538, 2729, -1000, -1000, 396, 303, 498, 1410, 3859, 3035, - -1000, 3047, 3037, -1000, 1250, 1219, -1000, -1000, -1000, -1000, - 4240, -1000, -1000, -1000, 3615, 4685, -1000, 2847, 2847, 2614, - 2614, 2614, 2614, 2614, 2798, 2798, 2753, 2753, -1000, -1000, - -1000, 8936, 4239, 20666, 20666, 20666, 20666, 4239, 20666, 20666, - 20666, 20666, 4238, -1000, 1421, 1421, 5605, 6039, 2662, -1000, - -1000, 2543, 2543, -1000, -1000, -1000, -1000, 16756, 247, 2973, - -1000, 16756, 3284, 2463, 3272, 2391, 2727, -1000, 4208, 16756, - 2467, 361, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 4108, 4105, 3412, 4833, 5068, 4101, 16756, -1000, - -1000, 2726, 2725, 2723, -1000, 3207, 15192, -1000, -1000, -1000, - 4100, 2465, 4096, -1000, -1000, -1000, 4095, 2722, 1870, 4092, - 3726, 4087, 4084, 4082, 4081, 2277, 2274, 2248, -1000, -1000, - -1000, -1000, 16756, 4056, 4021, 16756, 16756, 16756, 4077, 2719, - 2717, 16756, 16756, 16756, 16756, 4073, 16756, 16756, 16756, 16756, - 16756, 16756, 16756, 16756, -340, 16756, 16756, 16756, 16756, 16756, - 397, 397, 397, 397, 4016, 397, 2219, 2214, 4008, 4001, - 2452, 2245, 2244, 4737, 4872, -1000, -1000, 2714, -1000, 3035, - -1000, -1000, 4778, 4778, -1000, 4867, 4611, -200, 4237, 3452, - 2239, -1000, -1000, -326, 3789, 1313, 301, 79955, 79955, 1313, - 79955, 79955, 2912, 1313, 79955, -240, 3854, -1000, -1000, 3853, - -1000, -1000, 79955, 79955, 79955, 79955, 22, 4624, 4623, -1000, - -1000, 1693, 1577, 1676, -1000, 79955, -1000, 3852, 4637, 4630, - 4738, 1293, 79955, 79955, 37, 79955, 4236, 4235, 2450, 79955, - 79955, 563, -1000, -1000, 79955, 1953, -1000, 538, 99, 943, - 1851, 4401, 1256, 79955, 79955, 79955, 4668, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1721, -1000, 4616, - 4094, 3080, 1721, 4422, -100, -1000, 29251, 88535, 79955, 1918, - 1918, -1000, 4233, 2703, -1000, 72935, 44075, 44075, 44075, 44075, - 44075, 44075, 44075, 44075, -1000, 4484, 4444, 4232, -1000, 4500, - 4492, 4469, 852, 4483, 4457, 4429, 4227, -1000, 64355, -1000, - -1000, -1000, 2306, 2702, -1000, 537, 3546, 1448, 16756, 16756, - 4706, 4569, 4667, 4227, 2234, -1000, -1000, -1000, 2289, -1000, - 4781, 1303, 1222, 1222, 1485, 4779, 26911, -1000, 2761, 2009, - 1312, 4568, 643, -1000, 2761, -3, 1200, 2761, 2761, 2761, - 2761, 2761, 2761, 2761, 2761, 1082, 1073, 2761, 2761, 2761, - 2761, 2761, 2761, 2761, 2761, 2761, 2761, 2761, 1725, 2761, - 2761, 2761, 2761, 2761, -1000, 2761, 4231, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1099, 1020, -1000, -1000, 496, 582, - 1305, 223, 219, 559, 4705, 680, -1000, 1787, 706, -1000, - 2761, 4703, 2761, 38614, -1000, 1953, 969, 4702, 727, 79955, - 79955, 458, 2066, 2711, 248, 200, -1000, -1000, 2226, 11282, - 2226, 11282, 3445, -1000, -1000, 1298, -1000, -1000, 1851, -1000, - 79955, 79955, -1000, -1000, 4230, 2909, -1000, -1000, 23788, -1000, - 11282, 11282, -1000, -1000, 44855, 79955, -1000, 106, -1000, 183, - 4778, 2225, 2221, -1000, 3191, 4065, 4062, -1000, -1000, -1000, - -1000, -1000, -1000, -251, -1000, -1000, 79955, -1000, 79955, 79955, - 1832, -1000, 2215, 1851, 4418, 79955, 1276, -1000, -1000, 4229, - 79955, -1000, 3849, -1000, 4832, -251, 4829, 13628, -1000, -1000, - 72155, -1000, 71375, 2952, -1000, 21448, 3065, 285, -1000, 483, - -306, 283, 3013, 282, 3035, -1000, -1000, 4058, 4053, 4049, - 2689, -1000, 2687, 4036, -1000, 2685, 2684, 3444, -1000, -319, - 274, 4778, 4611, 3846, 2208, -1000, 4611, -1000, -331, -100, - -1000, 28471, 88535, 79955, 3839, 3173, 4663, 3602, -281, 16756, - 70595, 16756, 1532, 2449, 476, -1000, -1000, 896, 896, -1000, - 896, 896, -1000, -1000, 79955, 2206, 2908, 1404, 3845, -1000, - 2674, -1000, -1000, -1000, -1000, 3443, -1000, -1000, 2781, 79955, - -1000, -1000, 2342, 79955, 54995, -1000, -1000, -1000, -1000, 79955, - -1000, 582, 4400, -1000, 63575, -1000, 2781, -1000, -1000, 4791, - -1000, -1000, 16756, 16756, 236, 4791, 2781, 2781, -1000, 2748, - -1000, 79955, -1000, -377, 69815, 2044, -1000, 1297, 2438, 2433, - -1000, 63575, 614, 63575, -1000, -1000, 4765, -1000, 79955, 4618, - -1000, -1000, -1000, 3789, 2907, -372, 79955, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2671, -1000, 1421, - 1421, 5605, 4998, -1000, 1421, 1421, 5605, 4804, 20666, -1000, - 20666, -1000, 20666, -1000, -1000, -1000, -1000, 3962, -1000, 2951, - -1000, 16756, 3045, 5730, 16756, 491, 2588, 37834, 49535, 21, - 4622, 3957, 79955, 16756, -1000, -1000, 16756, 16756, 20666, -1000, - 3917, -1000, -1000, -1000, -1000, 16756, 16756, 3183, -1000, 79955, - -1000, -1000, -1000, -1000, 37834, -1000, 20666, -1000, -1000, -1000, - -1000, 16756, 16756, 16756, 2054, -341, -341, 2054, 3909, 2642, - 397, 397, -341, 3901, 3897, 3893, 2634, 397, 3847, 3843, - 3826, 3805, 3795, 3747, 3743, 3734, 4789, 3723, 3665, 2630, - 3637, 2439, -1000, 69035, -1000, -1000, -1000, 397, -1000, -351, - 16756, -351, 16756, -351, -351, 16756, 3159, 18320, 4778, 4737, - 14410, -1000, 4611, 4611, 622, -1000, -1000, 4228, 1199, 2181, - 3430, 3836, 197, -1000, 2906, -1000, 726, 59675, 79955, 4828, - 4826, -1000, 2426, 3834, 68255, -1000, 1599, 79955, -1000, -1000, - 4810, 4808, -1000, -1000, 79955, 79955, 79955, -1000, -1000, -1000, - 1573, -1000, 3833, -1000, -1000, 655, 651, 3276, 4862, 4860, - 2984, 3832, 597, 1925, 25348, 79955, 4227, 4227, 317, 2761, - 863, 992, 63575, 1107, -1000, 67475, 3105, 2902, 4417, -1000, - 1869, 4599, 79955, 66695, 1029, 1302, 4226, 890, 6620, -1000, - 4616, 4225, 79955, 4616, -1000, -331, -1000, 4606, 1817, -1000, - 4224, -1000, 2629, 4528, -1000, 2422, 2180, -1000, 2898, 2626, - 2625, 2897, -331, 346, 6984, -1000, 79955, 79955, 1929, -1000, - 2421, 380, 4399, 4399, 4399, -1000, 4399, 4399, -1000, -1000, - -1000, -1000, 4480, 3823, -1000, 4472, -1000, 4463, -1000, 4445, - -1000, -1000, -1000, -1000, 4460, -1000, -1000, -1000, 30032, -1000, - 44075, -1000, 1448, -1000, 4733, 1568, 1568, 1568, 2412, 4029, - 43294, 42514, -1000, -1000, 890, 6620, 4659, 6913, 4135, -1000, - 65915, -1000, -1000, -1000, 1348, -1000, 1568, 1568, 1228, 79955, - 3082, 1568, 3079, 4223, -1000, -1000, 1038, 79955, 79955, -1000, - 79955, 79955, 79955, 79955, 79955, 79955, 79955, -1000, -1000, 79955, - 65135, -1000, 79955, 79955, -1000, 79955, 3078, 79955, 79955, 3074, - 4592, 2761, 2761, 1501, -1000, -1000, 968, -1000, 65135, 3423, - 3422, 3418, 3417, 3414, 3822, 3818, 3815, 2761, 2761, 3413, - 3814, 64355, 3813, 2050, 3411, 3410, 3409, 3386, 3812, 1426, - -1000, 3811, 3351, 3340, 3330, 79955, 4222, 3709, -1000, -1000, - 3276, 3806, 4219, 3403, 3804, 1395, 582, 3801, 4413, 317, - 2761, 667, 79955, 2896, 2894, 37834, 2761, 38614, -1000, 992, - 957, 957, 936, 98, 32374, -1000, -1000, -1000, 79955, 79955, - 11282, -1000, -1000, 198, 125, -1000, -1000, -1000, -1000, 63575, - 3799, 917, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 4611, - 16756, 4580, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 79955, 1276, -1000, -1000, -1000, 25348, -1000, -1000, 79955, -1000, - 4791, -1000, 30032, -1000, -1000, -1000, 2418, -1000, 2994, -358, - 21448, 2785, 2751, -1000, 16756, 21448, 16756, -175, 665, -188, - -1000, -1000, -1000, -1000, 3798, -1000, -1000, -1000, 3401, -1000, - 3395, -1000, 138, 418, 449, 4611, -1000, 489, 3571, -1000, - -1000, 13628, 1817, 2619, 4527, 2180, 2609, -1000, -1000, -1000, - -1000, 4723, -1000, -1000, -1000, -1000, -1000, 242, -384, -391, - 238, 3796, 79955, 3380, -1000, -1000, -1000, -1000, -1000, 1738, - -1000, -1000, -1000, 4791, 2781, 4791, 54995, 2781, 2784, -1000, - -1000, -1000, -1000, 1851, -1000, -1000, 4791, -1000, 3035, 3035, - -1000, -1000, -377, 4791, 4791, 2781, -1000, -1000, 4807, 63575, - 582, 2632, 62795, -1000, 619, 2183, 960, 3794, -1000, 1362, - 195, 3791, 3789, -1000, -1000, -1000, -1000, 20666, -1000, -1000, - 20666, 2756, 2753, -1000, -1000, -1000, 3035, 16756, 4025, 4211, - 3258, 4022, 4019, -1000, -1000, 4211, 4211, -1000, 4208, 4209, - 4208, 2543, 2543, 4017, -1000, 4218, -1000, 4622, -1000, 2606, - 3198, 3628, 5914, 397, 3609, 3581, 16756, 2416, 4013, 5704, - 2308, 2065, 3569, 83, 397, 4787, 397, -41, 397, 397, - -1000, -1000, -1000, 397, 397, 397, 397, 397, -1000, 397, - 397, 397, 397, 397, 397, 397, 397, 4217, 397, 397, - 397, 397, 16756, -1000, 87755, -1000, 397, 4576, 2209, 397, - 2168, 397, 397, 3557, 27, -230, 25, -234, 4611, 4778, - -1000, -1000, -1000, 16756, 477, 4011, 4900, 2156, 954, 954, - 3789, 3770, 79955, -1000, -1000, -1000, 3766, 1691, -242, 79955, - -1000, -393, -409, 300, 79955, 3764, 79955, 79955, 259, 2981, - 3090, -1000, 3757, -1000, -1000, 62015, 79955, 79955, 81515, 1019, - 79955, 79955, 3755, -1000, -1000, 4216, -1000, 4215, -12, 4213, - 35, 3754, 4010, 2151, -1000, -1000, 79955, -1000, -1000, -1000, - 4009, 2102, -1000, -1000, -1000, 6620, 4212, 4211, 4211, 1667, - 4208, -1000, -1000, -1000, 4208, -1000, -1000, -1000, -1000, 4211, - 4211, 4211, 4211, 4211, 4211, 4210, -1000, -1000, 4209, 4209, - 4209, 4208, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1649, 4206, 4207, 4207, 4206, -1000, -1000, -1000, -1000, + 4169, 4168, 3247, 4922, 5511, 4167, 16847, -1000, -1000, 2747, + 2743, 2742, -1000, 3459, 15271, -1000, -1000, -1000, 4165, 2547, + 4152, -1000, -1000, -1000, 4150, 2737, 2183, 4146, 3468, 4140, + 4138, 4137, 4132, 2312, 2304, 2291, -1000, -1000, -1000, -1000, + 16847, 4055, 4051, 16847, 16847, 16847, 4130, 2736, 2735, 16847, + 16847, 16847, 16847, 4129, 16847, 16847, 16847, 16847, 16847, 16847, + 16847, 16847, -315, 16847, 16847, 16847, 16847, 16847, 416, 416, + 416, 416, 4043, 416, 2528, 2493, 4037, 4018, 2604, 2290, + 2287, 4804, 4967, -1000, -1000, 2731, -1000, 3153, -1000, -1000, + 4876, 4876, -1000, 4960, 4687, -179, 4302, 3478, 2286, -1000, + -1000, -294, 3786, 1339, 344, 80532, 80532, 1339, 80532, 80532, + 2908, 1339, 80532, -198, 3877, -1000, -1000, 3874, -1000, -1000, + 80532, 80532, 80532, 80532, -6, 4697, 4696, -1000, -1000, 1735, + 1702, 1678, -1000, 80532, -1000, 3873, 4707, 4705, 4806, 1306, + 80532, 80532, 75, 80532, 4300, 4298, 2531, 80532, 80532, 80532, + 548, -1000, -1000, 80532, 1902, -1000, 509, 131, 953, 1897, + 4471, 1267, 80532, 80532, 80532, 4737, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 1895, -1000, 4692, 4157, + 3109, 1895, 4514, -118, -1000, 29438, 89178, 80532, 1910, 1910, + -1000, 4297, 2726, -1000, 73458, 44376, 44376, 44376, 44376, 44376, + 44376, 44376, 44376, -1000, 4592, 4551, 4296, -1000, 4564, 4563, + 4554, 818, 4587, 4553, 4539, 4289, -1000, 64812, -1000, -1000, + -1000, 2584, 2725, -1000, 432, 3481, 1546, 16847, 16847, 4775, + 4666, 4732, 4289, 2274, -1000, -1000, -1000, 2488, -1000, 4879, + 1099, 1248, 1248, 1511, 4878, 27080, -1000, 2832, 1958, 1337, + 4653, 634, -1000, 2832, -27, 1226, 2832, 2832, 2832, 2832, + 2832, 2832, 2832, 2832, 1116, 1113, 2832, 2832, 2832, 2832, + 2832, 2832, 2832, 2832, 2832, 2832, 2832, 1754, 2832, 2832, + 2832, 2832, 2832, -1000, 2832, 4295, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1183, 1042, -1000, -1000, 470, 689, 1336, + 273, 271, 538, 4773, 693, -1000, 1884, 687, -1000, 2832, + 4772, 2832, 38873, -1000, 1902, 968, -274, 4770, 727, 80532, + 80532, 374, 2153, 2795, 252, 222, -1000, -1000, 2273, 11331, + 2273, 11331, 3477, -1000, -1000, 1322, -1000, -1000, 1897, -1000, + 80532, 80532, -1000, -1000, 4294, 2907, -1000, -1000, 23933, -1000, + 11331, 11331, -1000, -1000, 45162, 80532, -1000, 143, -1000, 232, + 4876, 2263, 2248, -1000, 3251, 4126, 4122, -1000, -1000, -1000, + -1000, -1000, -1000, -208, -1000, -1000, 80532, -1000, 80532, 80532, + 1886, -1000, 2237, 1897, 4513, 80532, 1321, -1000, -1000, 4291, + 80532, 80532, -1000, 3872, -1000, 4921, -208, 4920, 13695, -1000, + -1000, 72672, -1000, 71886, 2938, -1000, 21575, 3105, 304, -1000, + 441, -287, 302, 3035, 297, 3153, -1000, -1000, 4119, 4116, + 4115, 2708, -1000, 2707, 4112, -1000, 2704, 2696, 3476, -1000, + -269, 296, 4876, 4687, 3868, 2235, -1000, 4687, -1000, -300, + -118, -1000, 28652, 89178, 80532, 3863, 3319, 4731, 3538, -227, + 16847, 71100, 16847, 1629, 2506, 461, -1000, -1000, 1621, 1621, + -1000, 1621, 1621, -1000, -1000, 80532, 2225, 2906, 1335, 521, + 3859, -1000, -1000, 3472, -1000, -1000, 2765, 80532, -1000, -1000, + 2492, 80532, 55380, -1000, -1000, -1000, -1000, 80532, -1000, 689, + 4469, -1000, 64026, -1000, 2765, -1000, -1000, 4893, -1000, -1000, + 16847, 16847, 287, 4893, 2765, 2765, -1000, 2952, -1000, 80532, + -1000, -365, -1000, -1000, -1000, 2673, -1000, -1000, 70314, 2075, + -1000, 1314, 2498, 2485, -1000, 64026, 622, 64026, -1000, -1000, + 4848, -1000, 80532, 4694, -1000, -1000, -1000, 3786, 2903, -362, + 80532, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 2672, -1000, 1480, 1480, 5461, 5744, -1000, 1480, 1480, + 5461, 5243, 20787, -1000, 20787, -1000, 20787, -1000, -1000, -1000, + -1000, 4012, -1000, 2920, -1000, 16847, 3069, 6016, 16847, 428, + 3480, 38087, 49878, -7, 4691, 4004, 80532, 16847, -1000, -1000, + 16847, 16847, 20787, -1000, 3996, -1000, -1000, -1000, -1000, 16847, + 16847, 3243, -1000, 80532, -1000, -1000, -1000, -1000, 38087, -1000, + 20787, -1000, -1000, -1000, -1000, 16847, 16847, 16847, 2143, -316, + -316, 2143, 3986, 2670, 416, 416, -316, 3979, 3972, 3963, + 2660, 416, 3958, 3907, 3885, 3876, 3866, 3860, 3842, 3821, + 4887, 3817, 3785, 2658, 3777, 2568, -1000, 69528, -1000, -1000, + -1000, 416, -1000, -328, 16847, -328, 16847, -328, -328, 16847, + 3172, 18423, 4876, 4804, 14483, -1000, 4687, 4687, 607, -1000, + -1000, 4290, 1225, 2216, 3470, 3856, 212, -1000, 2901, -1000, + 722, 60096, 80532, 4918, 4916, -1000, 2479, 3854, 68742, -1000, + 1694, 80532, -1000, -1000, 4915, 4913, -1000, -1000, 80532, 80532, + 80532, -1000, -1000, -1000, 1661, -1000, 3853, -1000, -1000, 559, + 433, 3355, 4957, 4951, 2972, 3852, 554, 2018, 25505, 80532, + 4289, -274, 4289, 343, 2832, 872, 1110, 64026, 1163, -1000, + 67956, 3112, 2900, 4510, -1000, 945, 4672, 80532, 67170, 990, + 1389, 4288, 896, 7632, -1000, 4692, 4287, 80532, 4692, -1000, + -300, -1000, 4682, 1880, -1000, 4286, -1000, 2653, 4622, -1000, + 2463, 2186, -1000, 2896, 2648, 2644, 2892, -300, 378, 7455, + -1000, 80532, 80532, 2119, -1000, 2436, 318, 4465, 4465, 4465, + -1000, 4465, 4465, -1000, -1000, -1000, -1000, 4573, 3848, -1000, + 4571, -1000, 4570, -1000, 4567, -1000, -1000, -1000, -1000, 4552, + -1000, -1000, -1000, 30225, -1000, 44376, -1000, 1546, -1000, 4805, + 1556, 1556, 1556, 2513, 4111, 43589, 42803, -1000, -1000, 896, + 7632, 4730, 6425, 4211, -1000, 66384, -1000, -1000, -1000, 1587, + -1000, 1556, 1556, 1257, 80532, 3090, 1556, 3082, 4282, -1000, + -1000, 1072, 80532, 80532, -1000, 80532, 80532, 80532, 80532, 80532, + 80532, 80532, -1000, -1000, 80532, 65598, -1000, 80532, 80532, -1000, + 80532, 3081, 80532, 80532, 3077, 4652, 2832, 2832, 1608, -1000, + -1000, 951, -1000, 65598, 3467, 3466, 3463, 3462, 3461, 3847, + 3840, 3836, 2832, 2832, 3460, 3833, 64812, 3832, 1981, 3458, + 3445, 3441, 3368, 3813, 1448, -1000, 3811, 3366, 3356, 3339, + 80532, 4281, 3716, -1000, -1000, 3355, 3808, 4280, 3440, 3800, + 1455, 689, 3798, 4509, 343, 2832, 685, 80532, 2884, 2878, + 38087, 2832, 38873, -1000, 1110, 937, 937, -1000, -279, 950, + 130, 32585, -1000, -1000, -1000, 80532, 80532, 11331, -1000, -1000, + 251, 234, -1000, -1000, -1000, -1000, 64026, 3797, 893, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 4687, 16847, 4667, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 80532, 1321, -1000, + -1000, -1000, 25505, -1000, -1000, -1000, 80532, -1000, 4893, -1000, + 30225, -1000, -1000, -1000, 2427, -1000, 3006, -346, 21575, 2948, + 2767, -1000, 16847, 21575, 16847, -161, 666, -164, -1000, -1000, + -1000, -1000, 3796, -1000, -1000, -1000, 3426, -1000, 3419, -1000, + 228, 431, 448, 4687, -1000, 450, 3377, -1000, -1000, 13695, + 1880, 2642, 4621, 2186, 2641, -1000, -1000, -1000, -1000, 4788, + -1000, -1000, -1000, -1000, -1000, 261, -373, -376, 256, 3791, + 80532, 3418, -1000, -1000, -1000, -1000, -1000, 1749, -1000, -1000, + 4893, 2765, 4893, 55380, 2765, 2781, -1000, -1000, -1000, -1000, + 1897, -1000, -1000, 4893, -1000, 3153, 3153, -1000, -1000, -365, + 4893, 4893, 2765, -1000, -1000, -1000, 4912, 64026, 689, 2705, + 63240, -1000, 599, 2317, 926, 3790, -1000, 1439, 208, 3787, + 3786, -1000, -1000, -1000, -1000, 20787, -1000, -1000, 20787, 2791, + 2770, -1000, -1000, -1000, 3153, 16847, 4104, 4271, 3128, 4103, + 4101, -1000, -1000, 4271, 4271, -1000, 4266, 4267, 4266, 2682, + 2682, 4100, -1000, 4279, -1000, 4691, -1000, 2629, 3388, 3770, + 5119, 416, 3757, 3745, 16847, 2410, 4098, 4853, 2500, 2171, + 3710, 116, 416, 4885, 416, -67, 416, 416, -1000, -1000, + -1000, 416, 416, 416, 416, 416, -1000, 416, 416, 416, + 416, 416, 416, 416, 416, 4278, 416, 416, 416, 416, + 16847, -1000, 88392, -1000, 416, 4665, 2255, 416, 2180, 416, + 416, 3705, 51, -191, 48, -192, 4687, 4876, -1000, -1000, + -1000, 16847, 482, 4095, 6575, 2182, 960, 960, 3786, 3784, + 80532, -1000, -1000, -1000, 3783, 1732, -199, 80532, -1000, -377, + -378, 341, 80532, 3778, 80532, 80532, 313, 2953, 3104, -1000, + 3776, -1000, -1000, 62454, 80532, 80532, 82104, 1037, 80532, 80532, + 3774, -1000, -1000, 4277, -1000, 4276, -35, 4274, 72, 3773, + 4091, 2181, -1000, -1000, 80532, -1000, -1000, -1000, 4077, 2170, + -1000, -1000, -1000, 7632, 4273, 4271, 4271, 1663, 4266, -1000, + -1000, -1000, 4266, -1000, -1000, -1000, -1000, 4271, 4271, 4271, + 4271, 4271, 4271, 4269, -1000, -1000, 4267, 4267, 4267, 4266, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1804, + 4263, 4264, 4264, 4263, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 4657, 4654, 3492, -1000, -1000, - -1000, 41734, 79955, 957, -1000, -1000, -1000, 1092, 654, 3379, - 921, -1000, 79955, 856, 724, 4542, 2889, 3751, 79955, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 4599, - -1000, 1324, -377, 79955, 861, 22228, -1000, 1837, 4653, 79955, - -1000, 79955, 61235, -1000, -93, -1000, -1000, 24568, -1000, 2761, - 24568, 865, 2809, -1000, 16756, 2605, 4616, -1000, 3063, -100, - 14410, 2007, 79955, -100, 79955, 79955, 14410, -1000, 79955, -1000, - 79955, 16756, -1000, -1000, -331, 4007, -1000, 1190, 2075, 211, - 30032, 79955, -1000, 57335, 16756, -1000, -1000, 16756, 4204, -1000, - -1000, -1000, -346, -1000, 4006, -1000, -1000, -1000, -1000, -1000, - 4442, -1000, 306, -1000, 4203, 4567, -1000, -1000, -1000, 3750, - -1000, 2101, 55775, -1000, 2887, -1000, -1000, 2096, 54215, -1000, - 2886, -1000, -1000, 865, -1000, 1721, -1000, 2321, 1394, 27691, - -1000, 1187, 4561, 79955, 6620, -1000, 79955, -1000, 79955, 79955, - -1000, 79955, 79955, 1228, 16756, 974, 737, 698, -1000, 1066, - -1000, 903, 1650, 796, 1274, 1274, 4561, 79955, 1285, -1000, - 2079, -1000, 4622, -1000, -1000, 2078, -1000, -1000, -1000, -1000, - 79955, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 37834, - 37834, 4695, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 3746, 3741, -1000, -1000, + -1000, -1000, -1000, 4728, 4723, 4722, 3465, -1000, -1000, -1000, + 42017, 80532, 937, -1000, -1000, -1000, 1155, 569, 3410, 910, + -1000, 80532, 871, 717, 4641, 2877, 3766, 80532, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 4672, -1000, + 1539, -365, 80532, 870, 22361, -1000, 1883, 4719, 80532, -1000, + 80532, 61668, -1000, -112, -1000, -1000, 24719, -1000, 2832, 24719, + 880, 2837, -1000, 16847, 2620, 4692, -1000, 3050, -118, 14483, + 2289, 80532, -118, 80532, 80532, 14483, -1000, 80532, -1000, 80532, + 16847, -1000, -1000, -300, 4071, -1000, 1224, 2030, 233, 30225, + 80532, -1000, 57738, 16847, -1000, -1000, 16847, 4261, -1000, -1000, + -1000, -321, -1000, 4065, -1000, -1000, -1000, -1000, -1000, 4183, + -1000, 291, -1000, 4260, 4651, -1000, -1000, -1000, 3764, -1000, + 2158, 56166, -1000, 2874, -1000, -1000, 2122, 54594, -1000, 2872, + -1000, -1000, 880, -1000, 1895, -1000, 1616, 1149, 27866, -1000, + 1219, 4660, 80532, 7632, -1000, 80532, -1000, 80532, 80532, -1000, + 80532, 80532, 1257, 16847, 976, 757, 753, -1000, 1068, -1000, + 965, 1707, 837, 1325, 1325, 4660, 80532, 1309, -1000, 2105, + -1000, 4691, -1000, -1000, 2083, -1000, -1000, -1000, -1000, 80532, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 38087, 38087, + 4768, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 3758, 3755, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 79955, 2602, -1000, - 2884, 3740, 35, 10500, -1000, -1000, 1273, -1000, 4411, 1359, - 3492, 41734, 2881, 2711, 3736, 3735, -1000, 37834, -1000, 957, - -1000, 3733, 3732, -1000, 3105, 2877, 1358, 79955, -1000, 1850, - 79955, 79955, -1000, 1986, -1000, 2876, 2113, -1000, -1000, -1000, - -1000, 2044, 4005, -1000, -1000, 4605, -1000, -1000, 4593, -1000, - -1000, 4000, 854, 4786, 2000, 60455, -1000, -358, 2904, -1000, - 3025, 278, 3009, 79955, -1000, -1000, -1000, 3999, 3998, -1000, - -130, 450, 4777, 4776, 4605, -146, 3730, -1000, 1813, 1998, - -100, -1000, 1654, -1000, -1000, -1000, -1000, -412, -1000, -1000, - 896, -1000, 4791, -1000, 2781, 4791, 4791, -271, -1000, -1000, - -1000, -1000, 4791, 582, -1000, 2068, -1000, -1000, -1000, -1000, - -1000, -1000, 509, -1000, 79955, -1000, 1984, 194, -1000, -1000, - -1000, 3035, -1000, 1493, 491, -1000, -1000, -1000, 1481, -1000, - -1000, -1000, -1000, -1000, -1000, 40954, -1000, -1000, -1000, 16756, - -1000, -1000, -1000, -1000, -1000, 3543, 79955, -1000, -1000, 16756, - 16756, -1000, 3997, 3725, -1000, 4202, -1000, 3996, 3724, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 80532, 2617, -1000, 2868, + 3754, 72, 10543, -1000, -1000, 1287, -1000, 4504, 1436, 3465, + 42017, 2866, 2795, 3753, 3744, -1000, 38087, -1000, 937, -1000, + 3742, 3731, -1000, -1000, 2594, 3112, 2864, 1431, 80532, -1000, + 1892, 80532, 80532, -1000, 2193, -1000, 2860, 2102, -1000, -1000, + -1000, -1000, 2075, 4058, -1000, -1000, 4681, -1000, -1000, 4654, + -1000, -1000, 4056, 865, 4884, 2061, 60882, -1000, -346, 2861, + -1000, 3064, 295, 2936, 80532, -1000, -1000, -1000, 4050, 4049, + -1000, -123, 447, 4869, 4868, 4681, -142, 3728, -1000, 1848, + 2279, -118, -1000, 1795, -1000, -1000, -1000, -1000, -382, -1000, + -1000, 1621, -1000, 4893, -1000, 2765, 4893, 4893, -221, -1000, + -1000, -1000, -1000, 4893, 689, -1000, 2110, -1000, -1000, -1000, + -1000, -1000, -1000, 491, -1000, 80532, -1000, 2009, 206, -1000, + -1000, -1000, 3153, -1000, 1532, 428, -1000, -1000, -1000, 1525, + -1000, -1000, -1000, -1000, -1000, -1000, 41231, -1000, -1000, -1000, + 16847, -1000, -1000, -1000, -1000, -1000, 3689, 80532, -1000, -1000, + 16847, 16847, -1000, 4044, 3726, -1000, 4259, -1000, 4038, 3723, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 4872, -1000, -1000, -1000, -1000, 3537, - 3995, 1189, -1000, -1000, -1000, -351, 16756, -1000, -351, 16756, - -1000, -1000, 4806, 2594, 3994, 3988, 2581, 3983, 3982, 4605, - 4611, 1815, 3977, 1949, -1000, -1000, -1000, -1000, -1000, -1000, - 3974, 4900, 1513, 3717, 1513, -1000, -1000, -1000, -1000, 59675, - 79955, -1000, -1000, -1000, 59675, 79955, 4805, 40174, 1260, -377, - 895, 4195, -1000, 901, 2981, 1651, 4194, 3714, -1000, 79955, - 4802, 79955, 3276, 1013, 3276, 1057, 79955, -251, 55775, 54215, - 33, 3367, 10500, -1000, 3712, -1000, 17, 1925, 6620, 1391, - 25348, 4594, 1837, 1837, -1000, 3710, 535, -1000, -1000, -1000, - 811, -1000, 3366, -1000, -1000, 3280, 2462, 558, -1000, -1000, - -1000, -1000, -1000, -1000, 3215, 79955, 58895, 3215, 3440, 2874, - -378, -1000, 4193, -1000, 2761, 2761, 2761, 1260, 850, 79955, - 3973, 1884, -1000, -1000, -1000, -1000, -1000, 1837, -1000, 4551, - 79955, 2048, 3965, -258, 3955, 1207, 2749, 2746, -1000, 3353, - 2580, 4526, 1547, -1000, 3953, 1875, -100, -1000, -1000, 1817, - 2415, -1000, -1000, -1000, 2866, 3035, -1000, -1000, 58115, 30032, - 57335, 1996, -1000, 2401, -1000, 2958, 3035, 79955, -1000, 2386, - -1000, -1000, -1000, 56555, -1000, 4775, 4774, 249, 55775, 2576, - 54995, 54215, 2573, 53435, 1207, -1000, 52655, 2561, -1000, 79955, - -1000, -1000, 79955, 2560, -1000, 7796, 4191, -1000, 4190, 4189, - 4395, 952, 4188, 4187, 79955, 3533, 964, 3352, 20666, 4186, - 20666, 4185, 986, 4184, -1000, -1000, -1000, -1000, -1000, 1169, - 4585, -1000, 759, -1000, -1000, -1000, -1000, 1026, 1025, -1000, - -1000, 4561, 79955, 79955, -1000, 79955, -1000, 2589, -1000, 37834, - -1000, -1000, 2545, -1000, 3709, 3702, -1000, -1000, 3952, 3035, - -1000, 2340, 582, 1343, 79955, -1000, 535, 3693, 11282, -1000, - -1000, -1000, -1000, -1000, -1000, 4542, 3691, 3215, 79955, -1000, - 79955, 1850, 1850, 4872, 30032, 79955, 14410, -331, -1000, -1000, - 4572, 2694, -1000, -1000, -1000, 79955, 4784, 4773, -1000, 1227, - 21448, -189, 660, -1000, -1000, -1000, -135, 3688, -1000, -1000, - 4772, 3680, 3512, -1000, 274, 3679, -1000, -100, -1000, 1817, - 3664, -1000, -1000, -1000, 4791, -1000, -1000, 79955, -1000, 1851, - -1000, -1000, 1735, 1087, -1000, 4693, 3945, 4687, 2821, -1000, - -1000, -1000, 3524, -1000, -1000, 3493, 3434, -341, -1000, 4872, - 397, -1000, 3934, 397, -1000, 4872, -1000, 4770, 397, 3427, - 397, 3421, -351, 4558, -1000, 3658, -1000, -1000, -1000, 3657, - -1000, -1000, -1000, 4605, -1000, 16756, -1000, 3932, -1000, 3656, - -1000, -1000, -1000, 3655, -1000, 3654, -244, -1000, -1000, 697, - 1260, -1000, 609, 79955, 953, -1000, 51875, 10500, -379, 842, - 79955, 4801, 3649, 3276, 3646, 3276, 79955, 1009, -1000, 2536, - 2524, 4652, 3643, -1000, 3929, -1000, 3642, 3641, -1000, -1000, - 6620, -1000, 3466, 4866, 4866, -1000, -1000, 4764, -1000, 1871, - 690, -1000, -1000, 3220, 996, -1000, -1000, 3636, 963, -1000, - 1850, -1000, -1000, 2854, 3150, 3550, 49535, 37834, 38614, 3635, - -1000, 79955, -1000, 7267, 24568, -1000, 1260, 4718, 841, 4737, - 779, 4862, 7473, 1737, 2733, -1000, 3349, -1000, 3348, -1000, - -1000, 4183, 79955, -1000, -1000, 1817, 79955, 16756, 4791, 1996, - 199, -331, -1000, 2621, 307, -1000, 39394, 2497, -1000, 16756, - 2496, -1000, -1000, -1000, -1000, 4182, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1737, 79955, -1000, 1187, 4525, -1000, - -1000, 79955, -1000, 7796, -1000, -1000, 3093, 3053, 20666, -1000, - -1000, 3626, 3624, 3621, 38614, 1393, 2850, 2848, 1406, 4179, - -1000, 1037, 4842, 3347, -1000, -1000, -1000, 1464, -163, 4178, - 3054, 3015, -1000, 79955, -1000, 49535, 49535, 49535, 2070, 2070, - 49535, 49535, 4175, 1274, 4135, 4769, -1000, 5584, 79955, 5506, - 79955, 4174, 2844, 20666, 8140, 8140, 8140, 8140, 8140, 20666, - -1000, -1000, -1000, 2841, -1000, -1000, -1000, -1000, -1000, -1000, - 2761, 2485, -1000, -1000, -1000, -1000, -1000, 79955, 2378, -1000, - -1000, -1000, 3440, -1000, -1000, 1832, -1000, 4751, 1996, -1000, - -1000, -1000, -1000, -1000, 4513, -1000, -348, 16756, 17538, -1000, - -358, 79955, 79955, -137, 3344, -1000, 3620, 439, -1000, -1000, - 418, -1000, 1817, -1000, -1000, 2781, -139, 262, 37834, 2825, - 37834, -1000, 37834, 3925, 557, 7, -1000, -1000, -1000, 397, - 3915, -1000, 397, -1000, 594, 16756, -1000, -351, -1000, -351, - 397, -1000, 3911, 3906, -1000, 3356, -1000, -1000, -1000, -1000, - 79955, 79955, -1000, 79955, 3619, 3342, -1000, -1000, 2491, -1000, - -1000, -1000, 3033, 3027, 2489, 3831, 3541, 79955, 832, 79955, - -251, 3618, -251, 3614, 1001, 3276, -1000, -1000, -205, -1000, - -1000, -1000, -1000, 15, -1000, -1000, -1000, 694, -1000, 970, - 3507, 3336, -1000, -1000, 687, -1000, -1000, -1000, 3215, 3613, - -1000, -1000, 192, -1000, 2810, 2480, -1000, -1000, -1000, 811, - 1177, -1000, 1837, 4651, 7146, -1000, 2009, -1000, -1000, -1000, - 79955, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1735, 2761, - -1000, 1177, 1080, 2827, -1000, 3333, -1000, -1000, 16756, 1768, - -1000, 3035, 4872, -331, -1000, 13628, -1000, 3020, 79955, 79955, - -1000, -1000, -1000, 51095, 80735, 1067, 2472, -1000, 5385, 1357, - -1000, -1000, -1000, -1000, 5605, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 3596, 3589, -1000, -1000, -1000, -1000, -1000, - 3283, 4172, 217, -1000, 4686, 4650, 16756, -1000, -1000, 4171, - 2461, 2457, 2443, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 2440, 2428, 49535, -1000, - -1000, -1000, 976, -1000, 2389, -1000, 2385, 50315, 3277, 4788, - -1000, 2761, 2761, 3585, 3584, 790, -1000, -1000, 2761, 2761, - 2761, 2761, 2761, 2761, 4162, 3583, 3580, 2761, 2761, 2761, - 2761, 2761, 2761, 2806, -1000, -1000, -1000, 2803, 2761, 2761, - 2761, 5605, 8140, 3146, 37834, 2761, 2307, 79955, -1000, -331, - -331, 4511, -1000, 79955, 3035, 1907, 359, 4161, 4159, -1000, - -1000, -1000, 4156, -1000, -1000, 4768, -130, 4791, -141, 3574, - 415, 443, -1000, 3572, 3810, -1000, -1000, 11, 4510, 4507, - 3, -1000, -1000, -1000, -1000, -1000, 1549, -1000, -1000, -1000, - 1815, 397, 397, -1000, -1000, -1000, -1000, 3570, -1000, -1000, - -1000, -1000, -1000, 79955, 3556, -1000, -1000, 176, -1000, 2778, - -1000, 79955, 821, -1000, -251, -1000, -251, 3276, 3551, -1000, - 79955, 1031, -1000, -1000, -1000, -1000, 499, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 3550, 3547, -1000, -1000, 958, 4767, - -1000, 1837, 7473, -1000, 2761, 811, -1000, 405, 958, -1000, - 886, -1000, 2681, -1000, 3275, -1000, 2359, 4751, -1000, 1813, - 2966, 16756, 3020, 3020, -1000, -1000, 2339, -1000, 648, 4897, - -1000, 879, -1000, -1000, -1000, 5385, 971, -1000, -1000, 1170, - 4154, -1000, -1000, 3800, 16756, 4153, 2761, 4152, 3350, 26, - 49535, 4390, -1000, 4098, 3902, 3856, 2313, 965, -1000, -1000, - -1000, 2302, -1000, -1000, 3267, 3266, -1000, -1000, 79955, 3265, - 3263, 3261, 3260, 3259, 3255, 79955, -1000, -1000, 3247, 3224, - 3202, 3196, 3179, 3170, 3128, 3099, 3149, 3141, 3138, -1000, - -1000, -1000, 37834, 79955, -1000, -1000, -1000, -1000, 1801, -1000, - 4648, -1000, -305, 4151, 16756, 16756, 79955, 3512, -135, -1000, - -1000, 3545, -1000, 1241, 467, 443, -1000, 4766, 433, 4761, - 4760, 1782, -1000, 4505, -1000, -1000, -1000, -1000, 1398, -112, - 401, 394, 389, 305, -1000, -1000, -1000, -1000, -1000, -1000, - 3050, 3050, -251, 3541, 3536, -1000, 79955, -1000, -1000, 3531, - -251, 911, -1000, 612, -1000, -1000, -1000, 8040, -1000, 4758, - 1038, -1000, -1000, 37834, -1000, 4860, 4859, 4858, 4853, -1000, - -1000, -1000, -1000, -1000, 3130, -1000, -1000, -331, 4798, 3035, - 2965, 2888, 3748, 80735, 4869, 4664, 3526, -1000, -1000, -1000, - -1000, 2298, -1000, 79955, 1390, 12846, -1000, 3279, -1000, 37834, - 16756, -154, 4410, -1000, 490, 2280, 8140, 2070, 8140, 8140, - 2070, 8140, 2070, 8140, 2070, 606, -1000, 3109, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2272, -1000, + -1000, -1000, -1000, -1000, -1000, 4967, -1000, -1000, -1000, -1000, + 3685, 4030, 1221, -1000, -1000, -1000, -328, 16847, -1000, -328, + 16847, -1000, -1000, 4911, 2613, 4028, 4019, 2608, 4017, 4014, + 4681, 4687, 1849, 4010, 2003, -1000, -1000, -1000, -1000, -1000, + -1000, 4000, 6575, 1582, 3722, 1582, -1000, -1000, -1000, -1000, + 60096, 80532, -1000, -1000, -1000, 60096, 80532, 4904, 40445, 1279, + -365, 899, 4258, -1000, 905, 2953, 1729, 4257, 3719, -1000, + 80532, 4901, 80532, 3355, 1018, 3355, 1142, 80532, -208, 56166, + 54594, 67, 3408, 10543, -1000, 3718, -1000, -10, 2018, 7632, + 1425, 25505, 4671, 1883, 1883, 1883, -1000, 3717, 501, -1000, + -1000, -1000, 796, -1000, 3405, -1000, -1000, 3330, 2562, 528, + -1000, -1000, -1000, -1000, -1000, -1000, 3394, 80532, 59310, 3394, + 3448, 2855, -366, -1000, 4256, -1000, 2832, 2832, 2832, 1279, + 860, 80532, 3994, 1922, -1000, -1000, -1000, -1000, -1000, 1883, + -1000, 4644, 80532, 2134, 3991, -212, 3989, 1232, 2801, 2794, + -1000, 3404, 2606, 4620, 1570, -1000, 3980, 1899, -118, -1000, + -1000, 1880, 2380, -1000, -1000, -1000, 2854, 3153, -1000, -1000, + 58524, 30225, 57738, 1936, -1000, 2357, -1000, 3053, 3153, 80532, + -1000, 2465, -1000, -1000, -1000, 56952, -1000, 4866, 4865, 312, + 56166, 2593, 55380, 54594, 2589, 53808, 1232, -1000, 53022, 2588, + -1000, 80532, -1000, -1000, 80532, 2573, -1000, 5661, 4255, -1000, + 4252, 4251, 4468, 954, 4250, 4249, 80532, 3677, 967, 3399, + 20787, 4248, 20787, 4247, 983, 4246, -1000, -1000, -1000, -1000, + -1000, 1205, 4669, -1000, 755, -1000, -1000, -1000, -1000, 1049, + 1048, -1000, -1000, 4660, 80532, 80532, -1000, 80532, -1000, 2619, + -1000, 38087, -1000, -1000, 2571, -1000, 3716, 3712, -1000, -1000, + 3978, 3153, -1000, 2572, 689, 1428, 80532, -1000, 501, 3708, + 11331, -1000, -1000, -1000, -1000, -1000, -1000, 3396, 4641, 3706, + 3394, 80532, -1000, 80532, 1892, 1892, 4967, 30225, 80532, 14483, + -300, -1000, -1000, 4659, 2756, -1000, -1000, -1000, 80532, 4882, + 4863, -1000, 1251, 21575, -167, 652, -1000, -1000, -1000, -127, + 3704, -1000, -1000, 4862, 3698, 3556, -1000, 296, 3695, -1000, + -118, -1000, 1880, 3690, -1000, -1000, -1000, 4893, -1000, -1000, + 80532, -1000, 1897, -1000, -1000, 1743, 1150, -1000, 4767, 3977, + 4766, 2917, -1000, -1000, -1000, 3672, -1000, -1000, 3601, 3595, + -316, -1000, 4967, 416, -1000, 3975, 416, -1000, 4967, -1000, + 4860, 416, 3581, 416, 3558, -328, 4661, -1000, 3688, -1000, + -1000, -1000, 3686, -1000, -1000, -1000, 4681, -1000, 16847, -1000, + 3973, -1000, 3682, -1000, -1000, -1000, 3681, -1000, 3676, -201, + -1000, -1000, 714, 1279, -1000, 589, 80532, 1006, -1000, 52236, + 10543, -367, 844, 80532, 4890, 3675, 3355, 3670, 3355, 80532, + 1014, -1000, 2561, 2559, 4718, 3669, -1000, 3971, -1000, 3666, + 3663, -1000, -1000, 7632, -1000, 2401, 4959, -1000, 4959, -1000, + -1000, 4845, -1000, 2154, 698, -1000, -1000, 3303, 971, -1000, + -1000, 3662, 980, -1000, 1892, -1000, -1000, 2853, 3292, 3602, + 49878, 38087, 38873, 3656, -1000, 80532, -1000, 6752, 24719, -1000, + 1279, 4783, 839, 4804, 660, 4957, 6829, 1761, 2784, -1000, + 3390, -1000, 3389, -1000, -1000, 4240, 80532, -1000, -1000, 1880, + 80532, 16847, 4893, 1936, 225, -300, -1000, 2683, 339, -1000, + 39659, 2554, -1000, 16847, 2544, -1000, -1000, -1000, -1000, 4239, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1761, 80532, + -1000, 1219, 4618, -1000, -1000, 80532, -1000, 5661, -1000, -1000, + 3102, 3075, 20787, -1000, -1000, 3648, 3647, 3646, 38873, 1386, + 2852, 2850, 1443, 4238, -1000, 1080, 4933, 3382, -1000, -1000, + -1000, 1521, -150, 4237, 3048, 3040, -1000, 80532, -1000, 49878, + 49878, 49878, 1824, 1824, 49878, 49878, 4236, 1325, 4211, 4859, + -1000, 4693, 80532, 3886, 80532, 4234, 2849, 20787, 8414, 8414, + 8414, 8414, 8414, 20787, -1000, -1000, -1000, 2847, -1000, -1000, + -1000, -1000, -1000, -1000, 2832, 2405, -1000, -1000, -1000, -1000, + -1000, 80532, 2356, -1000, -1000, -1000, 697, 3448, -1000, -1000, + 1886, -1000, 4833, 1936, -1000, -1000, -1000, -1000, -1000, 4612, + -1000, -324, 16847, 17635, -1000, -346, 80532, 80532, -129, 3375, + -1000, 3644, 451, -1000, -1000, 431, -1000, 1880, -1000, -1000, + 2765, -132, 310, 38087, 2846, 38087, -1000, 38087, 3970, 535, + -18, -1000, -1000, -1000, 416, 3969, -1000, 416, -1000, 550, + 16847, -1000, -328, -1000, -328, 416, -1000, 3967, 3965, -1000, + 3549, -1000, -1000, -1000, -1000, 80532, 80532, -1000, 80532, 3642, + 3371, -1000, -1000, 2537, -1000, -1000, -1000, 3028, 3026, 2535, + 3964, 3589, 80532, 835, 80532, -208, 3633, -208, 3632, 1009, + 3355, -1000, -1000, -184, -1000, -1000, -1000, -1000, -11, -1000, + -1000, -1000, 646, -1000, 949, 3546, 3364, -1000, -1000, 692, + -1000, -1000, -1000, 3394, 3630, -1000, -1000, 203, -1000, 2845, + 2533, -1000, -1000, -1000, 796, 1208, -1000, 1883, 4716, 5665, + -1000, 1958, -1000, -1000, -1000, 80532, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, 1743, 2832, -1000, 1208, 1095, 2863, -1000, + 3363, -1000, -1000, 16847, 1810, -1000, 3153, 4967, -300, -1000, + 13695, -1000, 3024, 80532, 80532, -1000, -1000, -1000, 51450, 81318, + 1089, 2526, -1000, 5401, 1379, -1000, -1000, -1000, -1000, 5461, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 3629, 3624, + -1000, -1000, -1000, -1000, -1000, 3362, 4232, 121, -1000, 4765, + 4714, 16847, -1000, -1000, 4231, 2517, 2508, 2494, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 79955, 4148, -1000, 4147, 2207, 2205, - 2204, -1000, -1000, -137, -1000, 4144, 3038, 450, 429, 4757, - -1000, 3512, 4740, 3512, 3512, -1000, 408, 4809, 3002, -1000, - 419, 417, 403, 384, -1000, -1000, -1000, -1000, -1000, -1000, - 2981, -1000, 2981, -1000, -1000, -1000, -1000, -251, -1000, 3522, - -1000, -1000, -1000, -1000, -1000, -1000, 48755, 974, -1000, -1000, - -1000, 4141, -1000, 4140, -1000, 4139, -1000, -1000, 4683, -1000, - 4845, 4844, -1000, -1000, -1000, 3520, 4896, 245, -1000, 971, - 7473, -1000, 12846, 2200, -1000, 3035, -1000, 1274, -1000, 3166, - -1000, -1000, -1000, -1000, 4407, 4405, 4795, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 87755, - 2189, 16756, -1000, -1000, -1000, 79955, -1000, 4675, 37054, 434, - -1000, -1000, -1000, 3513, -1000, 3512, -1000, -1000, 2755, 5, - 1398, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -225, -1000, - 79955, 964, 47195, 47195, 47195, 79955, 3942, 3938, 3399, 3510, - 4138, -1000, 7473, 2166, -1000, 12846, -1000, -154, -1000, 4840, - -1000, 4799, 1518, 1518, 8140, 8140, 8140, 8140, 3739, -1000, - 4137, 3731, -1000, -1000, 79955, -1000, 2144, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 3503, 2, -1000, -1000, -1000, 3497, - 2143, 4135, 2120, -1000, 2752, -1000, -1000, 2110, -1000, 2744, - 2064, -1000, 2713, 1768, 79955, 4134, 79955, 4133, -1000, 4404, - -1000, -1000, 3431, -1000, 80735, -1000, -1000, -1000, -1000, -1000, - -1000, 3209, 1042, -1000, -1000, 16756, -1000, 1754, -1000, 2705, - -1000, 47975, -1000, -1000, -1000, -1000, -1000, -1000, 47195, 46415, - -1000, 47195, 46415, -1000, 47195, 46415, 2018, 2005, 16756, 2017, - 16756, 4888, -1000, 2014, -1000, -1000, -1000, 3728, 79955, 12064, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 4521, - 79955, 79955, 1959, 4517, 1946, 3399, 3399, -1000, -1000, -1000, - -1000, 3035, 4132, 1926, -1000, -1000, 4041, -1000, -1000, 3647, - -1000, 3625, 16756, 79955, 16756, 4889, 4891, 1885, -1000, 1863, + -1000, 2467, 2464, 49878, -1000, -1000, -1000, 979, -1000, 2430, + -1000, 2412, 50664, 3358, 3768, -1000, 2832, 2832, 3621, 3618, + 783, -1000, -1000, 2832, 2832, 2832, 2832, 2832, 2832, 4230, + 3615, 3614, 2832, 2832, 2832, 2832, 2832, 2832, 2840, -1000, + -1000, -1000, 2836, 2832, 2832, 2832, 5461, 8414, 3197, 38087, + 2832, 2349, 80532, -1000, -1000, -1000, -1000, -1000, -1000, -300, + -300, 4600, -1000, 80532, 3153, 1987, 412, 4229, 4228, -1000, + -1000, -1000, 4225, -1000, -1000, 4856, -123, 4893, -135, 3613, + 426, 511, -1000, 3612, 3961, -1000, -1000, -15, 4599, 4598, + -21, -1000, -1000, -1000, -1000, -1000, 1186, -1000, -1000, -1000, + 1849, 416, 416, -1000, -1000, -1000, -1000, 3609, -1000, -1000, + -1000, -1000, -1000, 80532, 3607, -1000, -1000, 195, -1000, 2833, + -1000, 80532, 823, -1000, -208, -1000, -208, 3355, 3604, -1000, + 80532, 1054, -1000, -1000, -1000, -1000, 486, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 3602, 3600, -1000, -1000, 964, 4854, + -1000, 1883, 6829, -1000, 2832, 796, -1000, 439, 964, -1000, + 894, -1000, 2763, -1000, 3354, -1000, 2399, 4833, -1000, 1848, + 2968, 16847, 3024, 3024, -1000, -1000, 2396, -1000, 518, 4993, + -1000, 882, -1000, -1000, -1000, 5401, 972, -1000, -1000, 1215, + 4224, -1000, -1000, 3935, 16847, 4223, 2832, 4222, 3365, -4, + 49878, 4467, -1000, 4461, 4456, 4452, 2394, 973, -1000, -1000, + -1000, 2393, -1000, -1000, 3351, 3349, -1000, -1000, 80532, 3348, + 3344, 3338, 3334, 3332, 3323, 80532, -1000, -1000, 3318, 3314, + 3313, 3311, 3275, 3253, 3177, 3141, 3250, 3212, 3207, -1000, + -1000, -1000, 38087, 80532, -1000, -1000, -1000, -1000, 1825, -1000, + 4695, -1000, -255, 4221, 16847, 16847, 80532, 3556, -127, -1000, + -1000, 3599, -1000, 1262, 429, 511, -1000, 4849, 440, 4847, + 4843, 1822, -1000, 4597, -1000, -1000, -1000, -1000, 1227, -119, + 413, 411, 409, 402, -1000, -1000, -1000, -1000, -1000, -1000, + 3088, 3088, -208, 3589, 3569, -1000, 80532, -1000, -1000, 3567, + -208, 908, -1000, 597, -1000, -1000, -1000, 8151, -1000, 4840, + 1072, -1000, -1000, 38087, -1000, 4951, 4950, 4949, 4946, -1000, + -1000, -1000, -1000, -1000, 3199, -1000, -1000, -300, 4900, 3153, + 2962, 2921, 3932, 81318, 4988, 4735, 3565, -1000, -1000, -1000, + -1000, 2392, -1000, 80532, 1424, 12907, -1000, 3331, -1000, 38087, + 16847, -143, 4495, -1000, 541, 2351, 8414, 1824, 8414, 8414, + 1824, 8414, 1824, 8414, 1824, 593, -1000, 3166, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 2329, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 80532, 4219, -1000, 4218, 2322, 2319, + 2275, -1000, -1000, -129, -1000, 4217, 3152, 447, 430, 4837, + -1000, 3556, 4807, 3556, 3556, -1000, 417, 4945, 3015, -1000, + 407, 375, 372, 370, -1000, -1000, -1000, -1000, -1000, -1000, + 2953, -1000, 2953, -1000, -1000, -1000, -1000, -208, -1000, 3564, + -1000, -1000, -1000, -1000, -1000, -1000, 49092, 976, -1000, -1000, + -1000, 4216, -1000, 4215, -1000, 4214, -1000, -1000, 4756, -1000, + 4942, 4941, -1000, -1000, -1000, 3561, 4992, 300, -1000, 972, + 6829, -1000, 12907, 2270, -1000, 3153, -1000, 1325, -1000, 3310, + -1000, -1000, -1000, -1000, 4491, 4490, 4898, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 88392, + 2264, 16847, -1000, -1000, -1000, 80532, -1000, 4749, 37301, 434, + -1000, -1000, -1000, 3559, -1000, 3556, -1000, -1000, 2830, -19, + 1227, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -189, -1000, + 80532, 967, 47520, 47520, 47520, 80532, 3983, 3957, 3402, 3555, + 4213, -1000, 6829, 2259, -1000, 12907, -1000, -143, -1000, 4902, + -1000, 4930, 1419, 1419, 8414, 8414, 8414, 8414, 3930, -1000, + 4212, 3929, -1000, -1000, 80532, -1000, 2258, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 3554, -23, -1000, -1000, -1000, 3552, + 2242, 4211, 2232, -1000, 2829, -1000, -1000, 2224, -1000, 2828, + 2197, -1000, 2818, 1810, 80532, 4210, 80532, 4206, -1000, 4489, + -1000, -1000, 3542, -1000, 81318, -1000, -1000, -1000, -1000, -1000, + -1000, 3126, 1086, -1000, -1000, 16847, -1000, 1786, -1000, 2815, + -1000, 48306, -1000, -1000, -1000, -1000, -1000, -1000, 47520, 46734, + -1000, 47520, 46734, -1000, 47520, 46734, 2194, 2245, 16847, 2190, + 16847, 4983, -1000, 2176, -1000, -1000, -1000, 3865, 80532, 12119, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 4617, + 80532, 80532, 2174, 4616, 2015, 3402, 3402, -1000, -1000, -1000, + -1000, 3153, 4204, 2040, -1000, -1000, 4202, -1000, -1000, 4478, + -1000, 4477, 16847, 80532, 16847, 4985, 4977, 1991, -1000, 1933, -1000, -1000, -1000, -1000, } var yyPgo = [...]int{ - 0, 44, 5783, 8, 1, 5780, 5779, 5778, 228, 100, - 325, 243, 5776, 134, 357, 401, 363, 382, 5775, 356, - 355, 5774, 5773, 5772, 353, 348, 5771, 5754, 5753, 5752, - 5751, 5750, 5749, 5733, 5730, 5726, 5725, 5724, 5723, 5722, - 5721, 5720, 5709, 5705, 5704, 5701, 5700, 5699, 5698, 5697, - 5696, 5695, 5694, 5692, 5691, 5690, 5689, 5688, 5687, 5686, - 5685, 5684, 354, 5683, 5679, 5677, 5676, 5675, 5674, 5673, - 5672, 5655, 5654, 5653, 5652, 5648, 5647, 5646, 5645, 5644, - 5637, 5636, 5635, 5628, 5627, 5625, 5624, 5621, 5620, 5619, - 5618, 5617, 5615, 5613, 5612, 5611, 5609, 5605, 5597, 5591, - 5590, 5587, 239, 5586, 347, 5585, 5584, 5583, 5582, 5581, - 5578, 5577, 4579, 5575, 91, 58, 72, 5574, 5573, 5571, - 5569, 5568, 5567, 5566, 5563, 352, 206, 5562, 5559, 5557, - 5556, 5555, 5553, 5552, 5551, 5550, 5546, 5544, 5541, 5533, - 188, 5532, 5531, 351, 5529, 5526, 5525, 5524, 5522, 286, - 5521, 150, 5520, 337, 233, 5519, 5518, 5497, 5494, 5493, - 5490, 5489, 152, 167, 5488, 5487, 5486, 5485, 5484, 5483, - 5482, 5480, 5479, 5478, 5477, 5476, 196, 5475, 321, 281, - 111, 5474, 76, 5473, 315, 161, 274, 5471, 294, 5470, - 207, 5469, 205, 5468, 5466, 5464, 5463, 5462, 5459, 5458, - 5456, 5455, 5453, 5452, 5451, 5450, 5449, 5448, 5446, 5445, - 5444, 5443, 5442, 5441, 5440, 5439, 5436, 5433, 5430, 5428, - 5427, 5425, 5420, 78, 5418, 342, 5417, 116, 5416, 120, - 110, 215, 5415, 146, 5398, 237, 5396, 114, 5395, 336, - 112, 5394, 33, 50, 5393, 296, 70, 118, 5391, 5390, - 334, 4099, 320, 5389, 200, 5388, 298, 5387, 5386, 5385, - 302, 84, 45, 253, 5384, 5382, 338, 226, 5381, 5380, - 5379, 343, 5377, 301, 229, 223, 124, 172, 5376, 225, - 5374, 117, 107, 123, 61, 65, 95, 136, 258, 180, - 5372, 5370, 135, 299, 179, 256, 144, 5369, 5364, 5361, - 11, 241, 308, 5360, 224, 232, 121, 5359, 5353, 283, - 5352, 5351, 5349, 295, 209, 5348, 148, 5347, 5346, 5345, - 35, 5344, 5336, 271, 262, 5335, 5331, 153, 5330, 5329, - 149, 252, 186, 5328, 113, 177, 219, 176, 5327, 4614, - 182, 139, 5323, 105, 163, 5321, 90, 5320, 5319, 5318, - 5317, 238, 5316, 5309, 204, 5308, 102, 5307, 5302, 5300, - 103, 5283, 104, 108, 157, 145, 5277, 46, 154, 143, - 5274, 5273, 5272, 5269, 5266, 14, 6, 4, 5265, 5263, - 5262, 5261, 7, 5260, 5259, 2, 5258, 43, 5257, 81, - 5256, 5254, 5253, 5252, 5251, 5249, 5248, 5247, 5246, 5244, - 5242, 5240, 53, 5239, 5238, 5235, 5210, 13, 28, 38, - 5208, 42, 5207, 220, 5206, 5205, 216, 5204, 5203, 267, - 5201, 5200, 138, 133, 5199, 140, 5197, 250, 5196, 63, - 5195, 5194, 106, 5193, 5192, 5191, 330, 5189, 5188, 5187, - 275, 5185, 5184, 5183, 5182, 816, 5181, 5180, 5179, 5177, - 5176, 5175, 476, 333, 3, 292, 41, 5173, 194, 210, - 5171, 66, 49, 5169, 73, 158, 289, 199, 162, 5168, - 5166, 5164, 830, 175, 147, 254, 0, 155, 293, 236, - 332, 5147, 5146, 350, 5145, 331, 300, 329, 119, 345, - 323, 5144, 5142, 93, 5141, 213, 115, 68, 203, 555, - 24, 372, 5140, 2978, 18, 263, 5139, 278, 5138, 40, - 25, 12, 187, 5137, 5136, 55, 361, 5135, 5134, 5133, - 190, 272, 5131, 5130, 316, 195, 85, 5124, 1729, 5123, - 51, 5122, 5121, 57, 5119, 247, 77, 48, 5118, 5117, - 169, 259, 327, 132, 467, 208, 251, 242, 217, 307, - 311, 130, 20, 246, 5115, 2368, 212, 159, 30, 5110, - 15, 305, 285, 288, 174, 5109, 131, 5108, 324, 340, - 280, 5107, 255, 21, 75, 62, 47, 69, 22, 99, - 97, 29, 37, 5105, 5103, 5102, 5101, 5100, 23, 67, - 5099, 79, 5097, 32, 5096, 5093, 82, 64, 5092, 83, - 16, 5091, 5090, 26, 19, 31, 5087, 59, 279, 222, - 178, 141, 109, 5086, 5083, 245, 554, 5081, 192, 191, - 197, 5080, 60, 5078, 5077, 5076, 5075, 4310, 1715, 5074, - 211, 5072, 5071, 5070, 5069, 5066, 5065, 277, 341, 193, - 230, 317, 318, 339, 5064, 125, 71, 282, 5063, 5062, - 5061, 126, 184, 5060, 5059, 5058, 5057, 52, 122, 5054, - 27, 5048, 36, 34, 54, 5047, 80, 5046, 5045, 5044, - 17, 261, 5043, 5042, 5041, 9, 5040, 5036, 5, 5035, - 5033, 173, 5032, 142, 39, 218, 221, 5031, 5030, 137, - 260, 183, 5029, 5026, 170, 322, 5025, 273, 5024, 3549, - 313, 335, 5023, 287, 5022, 5020, 5019, 290, 5018, 1719, - 5016, 5012, 304, 98, 127, 5011, 303, 166, 5010, 5009, - 129, 214, 171, 165, 88, 128, 5008, 164, 284, 5007, - 270, 5006, 312, 5005, 5004, 5000, 4998, 231, 4994, 4985, - 4976, 4974, 257, 4972, 4953, 265, 309, 4938, 4936, 319, - 314, 4933, 4922, 4921, 4919, 4918, 4914, 4913, 4912, 94, - 4911, 4910, 326, 328, 4908, 4906, 96, 4905, 4904, -} - -//line mysql_sql.y:16975 + 0, 47, 5795, 7, 1, 5794, 5793, 5792, 231, 83, + 332, 244, 5791, 150, 363, 307, 368, 249, 5790, 362, + 359, 5788, 5787, 5786, 367, 365, 5785, 5782, 5781, 5780, + 5779, 5777, 5776, 5775, 5774, 5773, 5772, 5770, 5768, 5766, + 5765, 5763, 5762, 5761, 5760, 5759, 5758, 5757, 5756, 5755, + 5754, 5752, 5751, 5750, 5749, 5748, 5747, 5746, 5742, 5741, + 5740, 5739, 5737, 5736, 5725, 5721, 5720, 243, 5717, 357, + 5716, 5714, 5713, 5712, 5710, 5709, 5708, 5707, 5706, 5704, + 5703, 5702, 5701, 5700, 5699, 5697, 5696, 5695, 5694, 5693, + 5692, 5691, 5690, 5689, 5688, 5686, 5685, 5683, 5682, 5681, + 5680, 5679, 5678, 5658, 5657, 5656, 5652, 5651, 5650, 164, + 5649, 364, 5648, 5641, 5640, 5639, 5632, 5631, 5630, 4643, + 5629, 105, 66, 75, 5628, 5608, 5607, 5606, 5605, 5604, + 5603, 5602, 356, 215, 5600, 5599, 5596, 5593, 5592, 5591, + 5590, 5589, 5587, 5586, 5585, 5580, 5579, 318, 5576, 5573, + 353, 5564, 5563, 5559, 5558, 5557, 299, 5554, 139, 5553, + 352, 239, 5552, 5551, 5550, 5549, 5548, 5547, 5546, 157, + 167, 5545, 5544, 5543, 5542, 5539, 5538, 5537, 5535, 5533, + 5532, 5531, 5529, 191, 5527, 321, 227, 112, 5526, 87, + 5524, 330, 169, 281, 5522, 297, 5521, 209, 5520, 200, + 5519, 5516, 5515, 5514, 5513, 5512, 5510, 5509, 5506, 5505, + 5503, 5502, 5501, 5500, 5499, 5498, 5496, 5495, 5494, 5493, + 5492, 5491, 5490, 5489, 5485, 5483, 5480, 5479, 5477, 5476, + 90, 5475, 351, 5474, 117, 5473, 120, 113, 213, 5469, + 147, 5468, 238, 5467, 116, 5465, 343, 114, 5454, 36, + 54, 5447, 340, 63, 138, 5445, 5444, 361, 4527, 325, + 5443, 223, 5441, 306, 5440, 5439, 5438, 304, 82, 50, + 271, 5437, 5436, 345, 230, 5435, 5434, 5433, 354, 5431, + 337, 232, 229, 125, 171, 5430, 211, 5429, 123, 74, + 122, 68, 77, 103, 131, 235, 186, 5426, 5424, 121, + 264, 184, 257, 152, 5423, 5422, 5421, 11, 242, 322, + 5420, 228, 233, 119, 5419, 5418, 287, 5414, 5412, 5411, + 298, 201, 5410, 148, 5409, 5408, 5393, 38, 5392, 5389, + 280, 276, 5388, 5386, 153, 5383, 5380, 115, 256, 193, + 5377, 109, 181, 237, 180, 5375, 4690, 183, 145, 5372, + 93, 177, 5371, 59, 5367, 5361, 5358, 5357, 255, 5352, + 5350, 204, 5349, 97, 5348, 5347, 5346, 107, 5345, 111, + 106, 158, 146, 5343, 46, 155, 144, 5338, 5337, 5332, + 5331, 5330, 15, 5, 6, 5323, 5322, 5321, 5319, 8, + 5318, 5317, 9, 5316, 43, 5315, 85, 5314, 5313, 5311, + 5310, 5309, 5308, 5307, 5306, 5305, 5304, 5302, 5300, 56, + 5299, 5298, 5297, 5295, 17, 29, 31, 5294, 45, 5293, + 261, 5292, 5291, 224, 5290, 5288, 277, 5286, 5285, 135, + 134, 5284, 136, 5266, 222, 5265, 65, 5263, 5262, 96, + 5259, 5253, 5251, 347, 5250, 5248, 5244, 269, 5238, 5237, + 5234, 5233, 836, 5232, 5230, 5228, 5226, 5224, 5223, 34, + 326, 2, 296, 40, 5221, 195, 196, 5220, 62, 49, + 5219, 79, 176, 288, 199, 161, 5218, 5217, 5214, 789, + 179, 151, 433, 0, 156, 323, 221, 342, 5212, 5211, + 348, 5210, 331, 293, 333, 137, 360, 273, 5209, 5208, + 95, 5207, 217, 118, 70, 220, 429, 22, 900, 5205, + 3230, 18, 268, 5204, 283, 5202, 12, 32, 25, 190, + 5199, 5194, 57, 346, 5192, 5190, 5189, 188, 278, 5187, + 5184, 313, 208, 108, 5183, 1836, 5178, 53, 5176, 5175, + 69, 5174, 251, 27, 52, 5173, 5172, 173, 260, 334, + 143, 263, 205, 253, 248, 212, 301, 312, 127, 20, + 236, 5171, 1980, 214, 163, 30, 5169, 13, 303, 290, + 247, 178, 5168, 154, 5167, 324, 344, 285, 5162, 252, + 28, 78, 61, 48, 72, 21, 101, 100, 24, 42, + 5161, 5160, 5158, 5156, 5155, 23, 64, 5153, 92, 5152, + 35, 5150, 5149, 80, 67, 5146, 98, 14, 5145, 5144, + 33, 19, 37, 5143, 60, 295, 225, 182, 142, 99, + 5142, 5141, 216, 203, 5139, 202, 192, 194, 5138, 71, + 5136, 5133, 5130, 5129, 3940, 1768, 5128, 210, 5127, 5125, + 5124, 5123, 5122, 5120, 279, 355, 197, 234, 315, 335, + 349, 5119, 124, 73, 289, 5118, 5116, 5115, 129, 185, + 5114, 5113, 5112, 5111, 51, 126, 5110, 26, 5109, 41, + 39, 55, 5108, 81, 5107, 5105, 5103, 4, 258, 5102, + 5099, 5098, 16, 5097, 5096, 3, 5095, 5094, 175, 5093, + 141, 44, 246, 292, 5092, 5091, 132, 265, 187, 5089, + 5088, 168, 327, 5087, 284, 5086, 4094, 316, 329, 5085, + 291, 5084, 5083, 5082, 294, 5081, 1760, 5079, 5078, 314, + 110, 133, 5076, 300, 166, 5075, 5072, 130, 219, 170, + 159, 86, 128, 5071, 162, 286, 5070, 262, 5069, 302, + 5067, 5062, 5061, 5054, 226, 5048, 5047, 5045, 5044, 266, + 5042, 5041, 267, 310, 5037, 5036, 339, 320, 5034, 5033, + 5032, 5031, 5030, 5029, 5026, 5024, 102, 5020, 5019, 336, + 358, 5018, 5002, 104, 5001, 5000, +} + +//line mysql_sql.y:17023 type yySymType struct { union interface{} id int @@ -13172,299 +13257,301 @@ func (st *yySymType) zeroFillOptUnion() bool { } var yyR1 = [...]int{ - 0, 756, 760, 12, 12, 9, 13, 13, 10, 10, + 0, 763, 767, 12, 12, 9, 13, 13, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 168, - 168, 467, 467, 468, 468, 170, 463, 463, 462, 462, - 171, 172, 173, 733, 733, 734, 734, 732, 732, 174, - 175, 214, 731, 731, 731, 731, 731, 731, 731, 731, - 216, 216, 216, 216, 216, 216, 216, 596, 169, 169, - 169, 169, 169, 169, 169, 297, 297, 298, 298, 184, - 184, 185, 185, 186, 186, 220, 220, 220, 220, 220, - 220, 220, 159, 740, 740, 740, 741, 741, 156, 197, - 196, 199, 199, 198, 198, 195, 195, 191, 194, 194, - 193, 193, 192, 187, 189, 189, 188, 190, 190, 157, - 140, 142, 142, 141, 158, 680, 680, 679, 679, 678, - 678, 623, 623, 624, 624, 454, 454, 454, 677, 677, - 677, 676, 676, 675, 675, 673, 673, 674, 674, 671, - 671, 672, 670, 669, 669, 669, 665, 665, 665, 661, - 661, 663, 662, 662, 664, 656, 656, 659, 659, 657, - 657, 657, 657, 660, 655, 655, 655, 654, 654, 139, - 139, 139, 557, 557, 138, 138, 572, 572, 572, 572, - 572, 570, 570, 570, 570, 570, 570, 569, 569, 568, - 568, 573, 573, 571, 571, 571, 571, 571, 571, 571, - 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, - 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, - 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, - 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, - 571, 571, 571, 571, 127, 127, 127, 127, 127, 127, - 127, 134, 132, 132, 132, 133, 746, 746, 745, 745, - 747, 747, 747, 747, 748, 748, 130, 130, 130, 131, - 567, 567, 567, 128, 129, 129, 556, 556, 562, 562, - 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, - 561, 561, 561, 566, 566, 566, 564, 564, 563, 563, - 565, 565, 117, 117, 117, 117, 117, 117, 121, 122, - 123, 123, 123, 123, 120, 119, 555, 555, 555, 555, - 555, 555, 555, 555, 555, 118, 118, 118, 118, 118, - 118, 103, 103, 103, 103, 103, 102, 102, 104, 104, - 104, 552, 552, 551, 135, 135, 136, 743, 743, 742, - 744, 744, 744, 744, 137, 147, 147, 147, 147, 147, - 147, 147, 147, 147, 147, 147, 147, 147, 147, 146, - 146, 146, 149, 149, 149, 148, 150, 126, 126, 126, - 126, 126, 126, 124, 124, 124, 124, 124, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 706, 706, 706, 706, - 706, 707, 707, 481, 482, 761, 484, 480, 480, 480, - 702, 702, 703, 704, 705, 705, 705, 705, 143, 310, - 310, 308, 308, 309, 309, 144, 311, 311, 311, 145, - 312, 312, 23, 307, 307, 595, 595, 20, 20, 20, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 175, 175, 474, 474, 475, 475, 177, 470, 470, + 469, 469, 178, 179, 180, 740, 740, 741, 741, 739, + 739, 181, 182, 221, 738, 738, 738, 738, 738, 738, + 738, 738, 223, 223, 223, 223, 223, 223, 223, 603, + 176, 176, 176, 176, 176, 176, 176, 304, 304, 305, + 305, 191, 191, 192, 192, 193, 193, 227, 227, 227, + 227, 227, 227, 227, 166, 747, 747, 747, 748, 748, + 163, 204, 203, 206, 206, 205, 205, 202, 202, 198, + 201, 201, 200, 200, 199, 194, 196, 196, 195, 197, + 197, 164, 147, 149, 149, 148, 165, 687, 687, 686, + 686, 685, 685, 630, 630, 631, 631, 461, 461, 461, + 684, 684, 684, 683, 683, 682, 682, 680, 680, 681, + 681, 678, 678, 679, 677, 676, 676, 676, 672, 672, + 672, 668, 668, 670, 669, 669, 671, 663, 663, 666, + 666, 664, 664, 664, 664, 667, 662, 662, 662, 661, + 661, 146, 146, 146, 564, 564, 145, 145, 579, 579, + 579, 579, 579, 577, 577, 577, 577, 577, 577, 576, + 576, 575, 575, 580, 580, 578, 578, 578, 578, 578, + 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, + 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, + 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, + 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, + 578, 578, 578, 578, 578, 578, 134, 134, 134, 134, + 134, 134, 134, 141, 139, 139, 139, 140, 753, 753, + 752, 752, 754, 754, 754, 754, 755, 755, 137, 137, + 137, 138, 574, 574, 574, 135, 136, 136, 563, 563, + 569, 569, 568, 568, 568, 568, 568, 568, 568, 568, + 568, 568, 568, 568, 568, 573, 573, 573, 571, 571, + 570, 570, 572, 572, 124, 124, 124, 124, 124, 124, + 128, 129, 130, 130, 130, 130, 127, 126, 562, 562, + 562, 562, 562, 562, 562, 562, 562, 125, 125, 125, + 125, 125, 125, 110, 110, 110, 110, 110, 109, 109, + 111, 111, 111, 559, 559, 558, 142, 142, 143, 750, + 750, 749, 751, 751, 751, 751, 144, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 153, 153, 153, 156, 156, 156, 155, 157, 133, + 133, 133, 133, 133, 133, 131, 131, 131, 131, 131, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 713, 713, + 713, 713, 713, 714, 714, 488, 489, 768, 491, 487, + 487, 487, 709, 709, 710, 711, 712, 712, 712, 712, + 150, 317, 317, 315, 315, 316, 316, 151, 318, 318, + 318, 152, 319, 319, 23, 314, 314, 602, 602, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 109, 109, 110, 110, 110, 110, 22, 101, - 106, 106, 106, 108, 418, 418, 419, 417, 417, 417, - 417, 417, 412, 412, 420, 420, 219, 59, 59, 59, - 59, 59, 59, 107, 107, 107, 107, 421, 421, 421, - 427, 427, 428, 428, 413, 413, 413, 413, 413, 413, - 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, - 413, 413, 413, 413, 413, 413, 397, 397, 397, 392, - 392, 392, 392, 393, 393, 394, 394, 395, 395, 395, - 395, 396, 396, 473, 473, 422, 422, 422, 424, 424, - 423, 416, 414, 414, 414, 414, 414, 414, 414, 414, - 415, 415, 415, 415, 425, 425, 426, 426, 99, 111, - 111, 524, 524, 521, 521, 521, 521, 105, 105, 105, - 105, 719, 719, 100, 100, 100, 730, 730, 627, 627, - 495, 495, 494, 494, 494, 494, 494, 494, 494, 494, - 494, 494, 494, 494, 494, 494, 494, 494, 632, 633, - 491, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 60, 61, 165, 165, 167, - 167, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 77, 231, 96, 97, 98, 75, 69, 72, 73, - 218, 221, 221, 221, 221, 68, 68, 68, 68, 541, - 541, 67, 762, 762, 466, 466, 85, 84, 71, 86, - 87, 88, 89, 90, 91, 66, 83, 83, 83, 83, - 83, 83, 83, 83, 94, 650, 650, 764, 764, 764, - 92, 93, 626, 626, 626, 82, 82, 81, 81, 80, - 79, 78, 78, 65, 65, 64, 64, 70, 203, 205, - 74, 204, 204, 206, 206, 488, 488, 488, 490, 490, - 486, 763, 763, 591, 591, 489, 489, 63, 63, 63, - 63, 95, 487, 487, 465, 485, 485, 485, 21, 21, - 19, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 20, 20, 20, 20, 20, 116, 116, 117, 117, 117, + 117, 22, 108, 113, 113, 113, 115, 425, 425, 426, + 424, 424, 424, 424, 424, 419, 419, 427, 427, 226, + 59, 59, 59, 59, 59, 59, 114, 114, 114, 114, + 428, 428, 428, 434, 434, 435, 435, 420, 420, 420, + 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, + 420, 420, 420, 420, 420, 420, 420, 420, 420, 404, + 404, 404, 399, 399, 399, 399, 400, 400, 401, 401, + 402, 402, 402, 402, 403, 403, 480, 480, 429, 429, + 429, 431, 431, 430, 423, 421, 421, 421, 421, 421, + 421, 421, 421, 422, 422, 422, 422, 432, 432, 433, + 433, 106, 118, 118, 531, 531, 528, 528, 528, 528, + 112, 112, 112, 112, 726, 726, 107, 107, 107, 737, + 737, 634, 634, 502, 502, 501, 501, 501, 501, 501, + 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, + 501, 639, 640, 498, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 69, 69, 69, 69, 60, 61, + 172, 172, 174, 174, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 84, 238, 103, 104, 105, 82, + 76, 79, 80, 225, 228, 228, 228, 228, 75, 75, + 75, 75, 548, 548, 74, 769, 769, 473, 473, 92, + 91, 78, 93, 94, 95, 96, 97, 98, 73, 90, + 90, 90, 90, 90, 90, 90, 90, 101, 657, 657, + 771, 771, 771, 99, 100, 633, 633, 633, 89, 89, + 88, 88, 87, 86, 85, 85, 72, 72, 71, 71, + 77, 210, 212, 81, 211, 211, 213, 213, 495, 495, + 495, 497, 497, 493, 770, 770, 598, 598, 496, 496, + 70, 70, 70, 70, 102, 494, 494, 472, 492, 492, + 492, 21, 21, 19, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 58, 35, 36, 34, 37, 39, 549, 549, 546, - 38, 29, 28, 31, 27, 27, 30, 32, 33, 33, - 17, 17, 17, 17, 24, 24, 25, 267, 267, 340, - 340, 713, 713, 709, 709, 710, 710, 710, 711, 711, - 712, 712, 765, 765, 765, 151, 644, 644, 644, 644, - 644, 644, 15, 15, 15, 15, 638, 638, 638, 643, - 643, 642, 641, 641, 640, 640, 639, 639, 639, 639, - 16, 16, 16, 16, 262, 262, 18, 18, 112, 112, - 113, 113, 114, 114, 114, 114, 114, 114, 116, 115, - 115, 296, 296, 637, 637, 637, 637, 637, 637, 554, - 554, 553, 553, 690, 690, 690, 691, 301, 301, 289, - 289, 289, 300, 300, 300, 300, 645, 645, 512, 692, - 692, 653, 653, 652, 652, 651, 651, 294, 294, 302, - 302, 302, 303, 303, 295, 295, 271, 271, 179, 179, - 179, 667, 667, 668, 668, 658, 658, 658, 658, 666, - 666, 622, 622, 402, 402, 456, 456, 457, 457, 249, - 245, 245, 245, 246, 246, 247, 247, 247, 247, 247, - 247, 247, 247, 247, 247, 247, 749, 749, 750, 751, - 752, 752, 753, 753, 754, 754, 754, 755, 755, 755, - 755, 755, 699, 699, 701, 701, 700, 293, 293, 284, - 284, 286, 286, 286, 285, 285, 285, 287, 288, 288, - 282, 282, 283, 283, 281, 280, 280, 279, 277, 277, - 277, 278, 278, 278, 306, 306, 306, 306, 251, 251, - 251, 251, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 253, 254, 254, 256, 255, 255, 255, 255, 257, - 258, 258, 260, 259, 259, 259, 259, 436, 436, 436, - 436, 436, 436, 436, 436, 436, 436, 436, 436, 252, - 264, 264, 265, 265, 266, 266, 266, 266, 266, 266, - 266, 266, 266, 266, 433, 433, 434, 434, 434, 434, - 434, 177, 177, 631, 631, 432, 432, 261, 261, 263, - 263, 263, 263, 431, 431, 430, 276, 276, 275, 275, - 274, 274, 274, 268, 268, 268, 268, 268, 268, 270, - 442, 442, 441, 441, 440, 440, 440, 440, 440, 440, - 443, 444, 444, 444, 269, 269, 155, 176, 176, 178, - 291, 290, 439, 438, 438, 438, 438, 305, 305, 304, - 304, 292, 292, 273, 273, 273, 273, 437, 272, 272, - 3, 3, 1, 1, 1, 1, 7, 7, 4, 4, - 4, 2, 2, 2, 5, 5, 6, 6, 435, 739, - 739, 738, 738, 737, 735, 735, 735, 736, 736, 736, - 736, 682, 682, 682, 682, 682, 474, 474, 474, 479, - 479, 477, 477, 477, 477, 477, 483, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 52, 53, 57, 160, 160, 163, 163, 161, 161, 162, - 162, 166, 166, 164, 164, 49, 322, 323, 50, 324, - 324, 325, 325, 326, 326, 327, 328, 329, 329, 329, - 329, 531, 531, 48, 313, 313, 314, 314, 315, 315, - 316, 317, 317, 317, 321, 318, 319, 319, 758, 758, - 757, 47, 47, 40, 40, 224, 224, 225, 225, 225, - 227, 227, 398, 398, 398, 226, 226, 228, 228, 228, - 714, 716, 716, 718, 717, 717, 717, 720, 720, 720, - 720, 720, 721, 721, 721, 721, 722, 722, 41, 200, - 200, 200, 237, 237, 210, 725, 725, 725, 724, 724, - 597, 597, 726, 726, 727, 727, 460, 460, 461, 461, - 222, 223, 223, 212, 202, 236, 236, 236, 236, 236, - 238, 238, 342, 342, 201, 207, 208, 209, 211, 213, - 215, 215, 217, 715, 723, 723, 723, 550, 550, 547, - 548, 548, 545, 544, 544, 544, 729, 729, 728, 728, - 728, 475, 475, 42, 540, 540, 542, 543, 543, 543, - 543, 543, 543, 543, 543, 532, 532, 532, 532, 532, - 46, 536, 536, 538, 538, 539, 539, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 537, 533, - 533, 535, 535, 529, 529, 530, 530, 530, 530, 530, - 530, 530, 530, 530, 45, 45, 45, 235, 235, 528, - 528, 525, 525, 525, 320, 320, 522, 522, 523, 523, - 520, 520, 520, 526, 526, 54, 55, 56, 527, 527, - 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, - 239, 299, 299, 244, 244, 244, 244, 244, 244, 242, - 242, 242, 242, 243, 243, 240, 240, 241, 241, 229, - 229, 229, 230, 230, 44, 44, 44, 44, 44, 44, + 26, 26, 26, 26, 26, 58, 35, 36, 34, 37, + 39, 556, 556, 553, 38, 29, 28, 31, 27, 27, + 30, 32, 33, 33, 17, 17, 17, 17, 24, 24, + 25, 274, 274, 347, 347, 720, 720, 716, 716, 717, + 717, 717, 718, 718, 719, 719, 772, 772, 772, 158, + 651, 651, 651, 651, 651, 651, 15, 15, 15, 15, + 645, 645, 645, 650, 650, 649, 648, 648, 647, 647, + 646, 646, 646, 646, 16, 16, 16, 16, 269, 269, + 18, 18, 119, 119, 120, 120, 121, 121, 121, 121, + 121, 121, 123, 122, 122, 303, 303, 644, 644, 644, + 644, 644, 644, 561, 561, 560, 560, 697, 697, 697, + 698, 308, 308, 296, 296, 296, 307, 307, 307, 307, + 652, 652, 519, 699, 699, 660, 660, 659, 659, 658, + 658, 301, 301, 309, 309, 309, 310, 310, 302, 302, + 278, 278, 186, 186, 186, 674, 674, 675, 675, 665, + 665, 665, 665, 673, 673, 629, 629, 409, 409, 463, + 463, 464, 464, 256, 252, 252, 252, 253, 253, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 756, 756, 757, 758, 759, 759, 760, 760, 761, 761, + 761, 762, 762, 762, 762, 762, 706, 706, 708, 708, + 707, 300, 300, 291, 291, 293, 293, 293, 292, 292, + 292, 294, 295, 295, 289, 289, 290, 290, 288, 287, + 287, 286, 284, 284, 284, 285, 285, 285, 313, 313, + 313, 313, 258, 258, 258, 258, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 260, 261, 261, 263, 262, + 262, 262, 262, 264, 265, 265, 267, 266, 266, 266, + 266, 443, 443, 443, 443, 443, 443, 443, 443, 443, + 443, 443, 443, 259, 271, 271, 272, 272, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 440, 440, + 441, 441, 441, 441, 441, 184, 184, 638, 638, 439, + 439, 268, 268, 270, 270, 270, 270, 438, 438, 437, + 283, 283, 282, 282, 281, 281, 281, 275, 275, 275, + 275, 275, 275, 277, 449, 449, 448, 448, 447, 447, + 447, 447, 447, 447, 450, 451, 451, 451, 276, 276, + 162, 183, 183, 185, 298, 297, 446, 445, 445, 445, + 445, 312, 312, 311, 311, 299, 299, 280, 280, 280, + 280, 444, 279, 279, 3, 3, 1, 1, 1, 1, + 7, 7, 4, 4, 4, 2, 2, 2, 5, 5, + 6, 6, 442, 746, 746, 745, 745, 744, 742, 742, + 742, 743, 743, 743, 743, 689, 689, 689, 689, 689, + 481, 481, 481, 486, 486, 484, 484, 484, 484, 484, + 490, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 52, 53, 57, 167, 167, + 170, 170, 168, 168, 169, 169, 173, 173, 171, 171, + 49, 329, 330, 50, 331, 331, 332, 332, 333, 333, + 334, 335, 336, 336, 336, 336, 538, 538, 48, 320, + 320, 321, 321, 322, 322, 323, 324, 324, 324, 328, + 325, 326, 326, 765, 765, 764, 62, 67, 67, 68, + 68, 68, 68, 63, 64, 65, 66, 66, 66, 47, + 47, 40, 40, 231, 231, 232, 232, 232, 234, 234, + 405, 405, 405, 233, 233, 235, 235, 235, 721, 723, + 723, 725, 724, 724, 724, 727, 727, 727, 727, 727, + 728, 728, 728, 728, 729, 729, 41, 207, 207, 207, + 244, 244, 217, 732, 732, 732, 731, 731, 604, 604, + 733, 733, 734, 734, 467, 467, 468, 468, 229, 230, + 230, 219, 209, 243, 243, 243, 243, 243, 245, 245, + 349, 349, 208, 214, 215, 216, 218, 220, 222, 222, + 224, 722, 730, 730, 730, 557, 557, 554, 555, 555, + 552, 551, 551, 551, 736, 736, 735, 735, 735, 482, + 482, 42, 547, 547, 549, 550, 550, 550, 550, 550, + 550, 550, 550, 539, 539, 539, 539, 539, 46, 543, + 543, 545, 545, 546, 546, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 544, 544, 544, 544, 544, 540, 540, 542, + 542, 536, 536, 537, 537, 537, 537, 537, 537, 537, + 537, 537, 45, 45, 45, 242, 242, 535, 535, 532, + 532, 532, 327, 327, 529, 529, 530, 530, 527, 527, + 527, 533, 533, 54, 55, 56, 534, 534, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, 246, 306, + 306, 251, 251, 251, 251, 251, 251, 249, 249, 249, + 249, 250, 250, 247, 247, 248, 248, 236, 236, 236, + 237, 237, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 181, 180, 180, 180, 180, 180, 183, - 183, 459, 459, 458, 458, 182, 399, 399, 51, 353, - 353, 614, 614, 609, 609, 609, 609, 609, 629, 629, - 629, 610, 610, 610, 611, 611, 611, 613, 613, 613, - 612, 612, 612, 612, 612, 628, 628, 630, 630, 630, - 574, 574, 575, 575, 575, 578, 578, 600, 600, 601, - 601, 599, 599, 607, 607, 606, 606, 605, 605, 603, - 603, 604, 602, 602, 602, 602, 594, 594, 593, 593, - 576, 576, 576, 576, 576, 577, 577, 577, 592, 592, - 598, 598, 362, 363, 363, 364, 364, 365, 232, 232, - 233, 233, 366, 367, 367, 368, 368, 369, 370, 370, - 371, 371, 372, 373, 373, 374, 374, 375, 378, 379, - 380, 380, 381, 381, 382, 386, 386, 383, 383, 384, - 384, 385, 376, 376, 377, 377, 360, 360, 361, 361, - 361, 429, 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, - 429, 429, 429, 429, 429, 429, 429, 688, 688, 689, - 388, 388, 400, 400, 400, 400, 400, 400, 387, 387, - 389, 389, 341, 341, 339, 339, 331, 331, 331, 331, - 331, 331, 234, 234, 234, 330, 330, 330, 330, 330, - 330, 332, 332, 333, 333, 334, 334, 334, 338, 338, - 337, 337, 337, 337, 337, 335, 335, 336, 336, 336, - 336, 336, 336, 559, 559, 685, 685, 686, 686, 681, - 681, 681, 684, 684, 684, 684, 684, 684, 684, 684, - 684, 684, 684, 687, 687, 687, 683, 683, 343, 453, - 453, 453, 476, 476, 476, 476, 478, 452, 452, 452, - 359, 359, 358, 358, 356, 356, 356, 356, 356, 356, - 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, - 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, - 560, 560, 560, 558, 558, 558, 492, 492, 493, 493, - 411, 410, 410, 410, 410, 410, 408, 409, 407, 407, - 407, 407, 407, 404, 404, 403, 403, 403, 405, 405, - 405, 405, 405, 405, 534, 534, 401, 401, 391, 391, - 391, 390, 390, 390, 608, 499, 499, 499, 499, 499, - 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, - 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, - 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, - 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, - 501, 406, 406, 406, 450, 450, 450, 450, 450, 450, - 450, 450, 450, 450, 450, 450, 450, 450, 450, 451, - 451, 451, 451, 451, 451, 451, 451, 502, 502, 508, - 508, 698, 698, 697, 344, 344, 344, 345, 345, 345, - 345, 345, 345, 345, 345, 345, 345, 345, 354, 354, - 354, 588, 588, 588, 588, 588, 589, 589, 589, 589, - 589, 590, 590, 590, 586, 586, 587, 587, 513, 514, - 514, 635, 635, 636, 636, 579, 579, 580, 580, 581, - 585, 585, 583, 583, 584, 584, 582, 449, 449, 449, - 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, - 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, - 449, 449, 449, 449, 449, 649, 649, 649, 446, 446, - 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, - 446, 446, 446, 446, 446, 446, 708, 708, 708, 693, - 693, 693, 694, 694, 694, 694, 694, 694, 694, 694, - 694, 694, 694, 694, 695, 695, 695, 695, 695, 695, - 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, - 695, 696, 696, 696, 696, 448, 448, 448, 448, 448, - 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, - 447, 447, 447, 447, 447, 447, 447, 447, 515, 515, - 516, 516, 646, 646, 646, 646, 646, 646, 647, 647, - 648, 648, 648, 648, 634, 634, 634, 634, 634, 634, - 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, - 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, - 634, 634, 634, 634, 634, 634, 500, 445, 445, 445, - 517, 509, 509, 510, 510, 511, 511, 503, 503, 503, - 503, 503, 504, 504, 506, 506, 506, 506, 506, 506, - 506, 506, 506, 506, 506, 506, 506, 506, 506, 498, - 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, - 498, 498, 498, 498, 498, 498, 505, 505, 768, 768, - 507, 507, 519, 519, 519, 518, 518, 518, 518, 518, - 518, 518, 357, 357, 357, 357, 497, 497, 497, 496, - 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, - 496, 346, 346, 346, 346, 346, 350, 350, 352, 352, - 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, - 352, 352, 351, 351, 351, 351, 351, 351, 349, 349, - 349, 349, 349, 347, 347, 347, 347, 347, 347, 347, - 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, - 347, 347, 347, 347, 347, 347, 347, 347, 152, 153, - 248, 248, 154, 154, 348, 355, 355, 355, 355, 355, - 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, - 355, 355, 355, 455, 455, 615, 615, 618, 618, 616, - 616, 617, 619, 619, 619, 620, 620, 620, 621, 621, - 621, 625, 625, 464, 464, 464, 472, 472, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, - 471, 471, 471, 471, 471, 471, 471, 471, 471, 470, - 470, 470, 470, 470, 470, 470, 470, 470, 469, 469, - 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, - 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, - 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, - 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, - 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, - 469, 469, 469, 766, 766, 767, 767, 412, 412, 759, - 759, + 44, 188, 187, 187, 187, 187, 187, 190, 190, 466, + 466, 465, 465, 189, 406, 406, 51, 360, 360, 621, + 621, 616, 616, 616, 616, 616, 636, 636, 636, 617, + 617, 617, 618, 618, 618, 620, 620, 620, 619, 619, + 619, 619, 619, 635, 635, 637, 637, 637, 581, 581, + 582, 582, 582, 585, 585, 607, 607, 608, 608, 606, + 606, 614, 614, 613, 613, 612, 612, 610, 610, 611, + 609, 609, 609, 609, 601, 601, 600, 600, 583, 583, + 583, 583, 583, 584, 584, 584, 599, 599, 605, 605, + 369, 370, 370, 371, 371, 372, 239, 239, 240, 240, + 373, 374, 374, 375, 375, 376, 377, 377, 378, 378, + 379, 380, 380, 381, 381, 382, 385, 386, 387, 387, + 388, 388, 389, 393, 393, 390, 390, 391, 391, 392, + 383, 383, 384, 384, 367, 367, 368, 368, 368, 436, + 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, + 436, 436, 436, 436, 436, 695, 695, 696, 395, 395, + 407, 407, 407, 407, 407, 407, 394, 394, 396, 396, + 348, 348, 346, 346, 338, 338, 338, 338, 338, 338, + 241, 241, 241, 337, 337, 337, 337, 337, 337, 339, + 339, 340, 340, 341, 341, 341, 345, 345, 344, 344, + 344, 344, 344, 342, 342, 343, 343, 343, 343, 343, + 343, 566, 566, 692, 692, 693, 693, 688, 688, 688, + 691, 691, 691, 691, 691, 691, 691, 691, 691, 691, + 691, 694, 694, 694, 690, 690, 350, 460, 460, 460, + 483, 483, 483, 483, 485, 459, 459, 459, 366, 366, + 365, 365, 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 363, 363, 567, 567, + 567, 565, 565, 565, 499, 499, 500, 500, 418, 417, + 417, 417, 417, 417, 415, 416, 414, 414, 414, 414, + 414, 411, 411, 410, 410, 410, 412, 412, 412, 412, + 412, 412, 541, 541, 408, 408, 398, 398, 398, 397, + 397, 397, 615, 506, 506, 506, 506, 506, 506, 506, + 506, 506, 506, 506, 506, 506, 506, 506, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 508, 508, 508, 413, + 413, 413, 457, 457, 457, 457, 457, 457, 457, 457, + 457, 457, 457, 457, 457, 457, 457, 458, 458, 458, + 458, 458, 458, 458, 458, 509, 509, 515, 515, 705, + 705, 704, 351, 351, 351, 352, 352, 352, 352, 352, + 352, 352, 352, 352, 352, 352, 361, 361, 361, 595, + 595, 595, 595, 595, 596, 596, 596, 596, 596, 597, + 597, 597, 593, 593, 594, 594, 520, 521, 521, 642, + 642, 643, 643, 586, 586, 587, 587, 588, 592, 592, + 590, 590, 591, 591, 589, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 456, 456, 656, 656, 656, 453, 453, 453, 453, + 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, + 453, 453, 453, 453, 715, 715, 715, 700, 700, 700, + 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, + 701, 701, 702, 702, 702, 702, 702, 702, 702, 702, + 702, 702, 702, 702, 702, 702, 702, 702, 702, 703, + 703, 703, 703, 455, 455, 455, 455, 455, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 522, 522, 523, 523, + 653, 653, 653, 653, 653, 653, 654, 654, 655, 655, + 655, 655, 641, 641, 641, 641, 641, 641, 641, 641, + 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, + 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, + 641, 641, 641, 641, 507, 452, 452, 452, 524, 516, + 516, 517, 517, 518, 518, 510, 510, 510, 510, 510, + 511, 511, 513, 513, 513, 513, 513, 513, 513, 513, + 513, 513, 513, 513, 513, 513, 513, 505, 505, 505, + 505, 505, 505, 505, 505, 505, 505, 505, 505, 505, + 505, 505, 505, 505, 512, 512, 775, 775, 514, 514, + 526, 526, 526, 525, 525, 525, 525, 525, 525, 525, + 364, 364, 364, 364, 504, 504, 504, 503, 503, 503, + 503, 503, 503, 503, 503, 503, 503, 503, 503, 353, + 353, 353, 353, 353, 357, 357, 359, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, + 358, 358, 358, 358, 358, 358, 356, 356, 356, 356, + 356, 354, 354, 354, 354, 354, 354, 354, 354, 354, + 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, + 354, 354, 354, 354, 354, 354, 159, 160, 255, 255, + 161, 161, 355, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 462, 462, 622, 622, 625, 625, 623, 623, 624, + 626, 626, 626, 627, 627, 627, 628, 628, 628, 632, + 632, 471, 471, 471, 479, 479, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 477, 477, 477, 477, 477, 477, 477, + 477, 477, 476, 476, 476, 476, 476, 476, 476, 476, + 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, + 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, + 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, + 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, + 476, 476, 476, 476, 476, 476, 476, 773, 773, 774, + 774, 419, 419, 766, 766, } var yyR2 = [...]int{ @@ -13474,241 +13561,242 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, - 8, 0, 2, 0, 2, 12, 1, 3, 0, 3, - 3, 3, 5, 0, 1, 1, 1, 1, 2, 4, - 5, 6, 1, 2, 1, 2, 3, 7, 6, 5, - 10, 10, 11, 11, 12, 8, 13, 1, 5, 6, - 8, 5, 3, 5, 8, 1, 3, 3, 5, 5, - 5, 1, 1, 0, 3, 5, 7, 9, 9, 11, - 8, 6, 4, 0, 1, 1, 0, 1, 5, 2, - 2, 6, 9, 6, 9, 4, 7, 8, 0, 1, - 1, 2, 4, 6, 1, 2, 4, 0, 2, 10, - 11, 5, 7, 5, 2, 0, 2, 1, 3, 3, - 3, 0, 2, 0, 2, 1, 3, 5, 0, 2, - 3, 1, 3, 1, 1, 1, 3, 1, 3, 1, - 1, 1, 1, 0, 3, 3, 0, 3, 3, 0, - 1, 3, 0, 1, 3, 0, 2, 1, 2, 3, - 4, 3, 3, 1, 0, 1, 1, 0, 1, 8, - 5, 7, 0, 3, 8, 5, 1, 3, 3, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 4, 1, 3, 1, 2, 2, 2, 2, 2, 2, - 2, 1, 2, 2, 2, 2, 1, 1, 2, 2, - 1, 1, 1, 1, 1, 2, 2, 2, 1, 2, - 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, - 1, 1, 3, 2, 2, 2, 2, 2, 2, 2, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 6, 3, 4, 4, 5, 1, 3, 3, 1, - 2, 2, 2, 1, 2, 2, 3, 4, 4, 6, - 1, 1, 1, 2, 4, 6, 1, 4, 1, 3, - 3, 4, 4, 4, 4, 3, 3, 2, 4, 4, - 2, 2, 2, 1, 1, 1, 1, 1, 1, 3, - 1, 3, 1, 1, 1, 1, 1, 1, 2, 3, - 3, 4, 5, 4, 2, 2, 0, 1, 4, 2, - 4, 1, 5, 3, 2, 1, 2, 2, 4, 4, - 5, 2, 1, 3, 4, 4, 1, 2, 10, 8, - 10, 1, 3, 3, 1, 1, 3, 1, 3, 2, - 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, - 4, 4, 3, 2, 4, 3, 3, 1, 1, 1, - 1, 1, 1, 2, 3, 4, 7, 1, 5, 5, - 6, 6, 6, 6, 2, 3, 3, 4, 3, 4, - 4, 5, 3, 4, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 2, 1, 1, 1, 1, 1, 4, 0, - 1, 1, 3, 1, 4, 4, 0, 1, 2, 4, - 0, 3, 4, 1, 1, 0, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 6, 8, 6, 8, 5, 5, 10, 7, - 4, 4, 4, 3, 1, 3, 3, 5, 5, 5, - 5, 5, 1, 3, 1, 6, 7, 4, 4, 7, - 8, 6, 6, 8, 6, 11, 10, 3, 3, 3, - 1, 1, 1, 3, 2, 4, 5, 5, 6, 5, - 5, 3, 2, 2, 1, 3, 4, 3, 7, 5, - 8, 2, 2, 1, 3, 2, 0, 1, 1, 1, + 1, 8, 8, 0, 2, 0, 2, 12, 1, 3, + 0, 3, 3, 3, 5, 0, 1, 1, 1, 1, + 2, 4, 5, 6, 1, 2, 1, 2, 3, 7, + 6, 5, 10, 10, 11, 11, 12, 8, 13, 1, + 5, 6, 8, 5, 3, 5, 8, 1, 3, 3, + 5, 5, 5, 1, 1, 0, 3, 5, 7, 9, + 9, 11, 8, 6, 4, 0, 1, 1, 0, 1, + 5, 2, 2, 6, 9, 6, 9, 4, 7, 8, + 0, 1, 1, 2, 4, 6, 1, 2, 4, 0, + 2, 10, 11, 5, 7, 5, 2, 0, 2, 1, + 3, 3, 3, 0, 2, 0, 2, 1, 3, 5, + 0, 2, 3, 1, 3, 1, 1, 1, 3, 1, + 3, 1, 1, 1, 1, 0, 3, 3, 0, 3, + 3, 0, 1, 3, 0, 1, 3, 0, 2, 1, + 2, 3, 4, 3, 3, 1, 0, 1, 1, 0, + 1, 8, 5, 7, 0, 3, 8, 5, 1, 3, + 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 4, 1, 3, 1, 2, 2, 2, 2, + 2, 2, 2, 1, 2, 2, 2, 2, 1, 1, + 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, + 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, + 2, 1, 1, 1, 3, 2, 2, 2, 2, 2, + 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 6, 3, 4, 4, 5, 1, 3, + 3, 1, 2, 2, 2, 1, 2, 2, 3, 4, + 4, 6, 1, 1, 1, 2, 4, 6, 1, 4, + 1, 3, 3, 4, 4, 4, 4, 3, 3, 2, + 4, 4, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, + 2, 3, 3, 4, 5, 4, 2, 2, 0, 1, + 4, 2, 4, 1, 5, 3, 2, 1, 2, 2, + 4, 4, 5, 2, 1, 3, 4, 4, 1, 2, + 10, 8, 10, 1, 3, 3, 1, 1, 3, 1, + 3, 2, 1, 2, 1, 2, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, + 1, 4, 4, 4, 3, 2, 4, 3, 3, 1, + 1, 1, 1, 1, 1, 2, 3, 4, 7, 1, + 5, 5, 6, 6, 6, 6, 2, 3, 3, 4, + 3, 4, 4, 5, 3, 4, 4, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 1, 0, 1, 2, 1, 3, - 2, 1, 2, 2, 1, 2, 3, 2, 2, 2, - 3, 5, 3, 3, 1, 1, 3, 3, 7, 4, - 3, 1, 2, 4, 5, 3, 4, 7, 7, 8, - 8, 0, 4, 7, 6, 6, 0, 3, 0, 2, - 0, 1, 1, 1, 1, 4, 2, 2, 3, 3, - 4, 5, 3, 4, 4, 2, 2, 2, 3, 0, + 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, + 4, 0, 1, 1, 3, 1, 4, 4, 0, 1, + 2, 4, 0, 3, 4, 1, 1, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 6, 8, 6, 8, 5, + 5, 10, 7, 4, 4, 4, 3, 1, 3, 3, + 5, 5, 5, 5, 5, 1, 3, 1, 6, 7, + 4, 4, 7, 8, 6, 6, 8, 6, 11, 10, + 3, 3, 3, 1, 1, 1, 3, 2, 4, 5, + 5, 6, 5, 5, 3, 2, 2, 1, 3, 4, + 3, 7, 5, 8, 2, 2, 1, 3, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, + 2, 1, 3, 2, 1, 2, 2, 1, 2, 3, + 2, 2, 2, 3, 5, 3, 3, 1, 1, 3, + 3, 7, 4, 3, 1, 2, 4, 5, 3, 4, + 7, 7, 8, 8, 0, 4, 7, 6, 6, 0, + 3, 0, 2, 0, 1, 1, 1, 1, 4, 2, + 2, 3, 3, 4, 5, 3, 4, 4, 2, 2, + 2, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 5, 0, 2, 0, - 2, 5, 7, 8, 5, 5, 7, 9, 8, 8, - 11, 5, 1, 3, 3, 3, 5, 4, 3, 3, - 3, 4, 5, 6, 5, 2, 5, 6, 5, 0, - 2, 7, 0, 1, 0, 1, 5, 5, 3, 3, - 2, 4, 4, 4, 4, 4, 1, 1, 1, 3, - 3, 1, 1, 1, 6, 0, 1, 1, 1, 1, - 5, 5, 0, 1, 1, 3, 6, 3, 6, 3, - 4, 7, 7, 5, 4, 7, 8, 3, 3, 4, - 2, 3, 4, 4, 3, 0, 2, 2, 0, 2, - 2, 1, 1, 1, 1, 0, 1, 5, 5, 6, - 4, 3, 1, 3, 1, 1, 3, 5, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, + 0, 2, 0, 2, 5, 7, 8, 5, 5, 7, + 9, 8, 8, 11, 5, 1, 3, 3, 3, 5, + 4, 3, 3, 3, 4, 5, 6, 5, 2, 5, + 6, 5, 0, 2, 7, 0, 1, 0, 1, 5, + 5, 3, 3, 2, 4, 4, 4, 4, 4, 1, + 1, 1, 3, 3, 1, 1, 1, 6, 0, 1, + 1, 1, 1, 5, 5, 0, 1, 1, 3, 6, + 3, 6, 3, 4, 7, 7, 5, 4, 7, 8, + 3, 3, 4, 2, 3, 4, 4, 3, 0, 2, + 2, 0, 2, 2, 1, 1, 1, 1, 0, 1, + 5, 5, 6, 4, 3, 1, 3, 1, 1, 3, + 5, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 4, 5, 5, 4, 4, 4, 1, 3, 1, - 4, 6, 6, 5, 4, 4, 3, 7, 3, 5, - 1, 1, 2, 2, 12, 9, 10, 1, 3, 2, - 4, 0, 2, 0, 1, 1, 1, 1, 0, 1, - 0, 1, 0, 1, 1, 6, 2, 1, 5, 4, - 4, 2, 1, 2, 1, 2, 4, 5, 5, 1, - 2, 4, 0, 2, 1, 2, 2, 6, 5, 9, - 6, 6, 6, 7, 0, 2, 1, 2, 8, 10, - 1, 2, 7, 5, 13, 13, 10, 10, 1, 0, - 2, 1, 3, 2, 1, 5, 4, 4, 2, 0, - 1, 5, 4, 0, 1, 3, 3, 1, 3, 1, - 3, 5, 1, 3, 3, 5, 1, 3, 4, 0, - 1, 0, 1, 1, 3, 1, 1, 0, 4, 0, - 4, 4, 3, 5, 1, 3, 2, 1, 0, 10, - 2, 0, 2, 0, 2, 0, 4, 7, 4, 0, - 2, 0, 2, 0, 2, 0, 4, 1, 3, 3, - 1, 1, 1, 1, 4, 7, 4, 6, 4, 5, - 6, 8, 4, 6, 5, 6, 0, 1, 4, 8, - 0, 6, 0, 4, 0, 4, 6, 1, 1, 1, - 1, 1, 2, 3, 1, 3, 6, 0, 3, 0, - 1, 0, 1, 1, 2, 4, 4, 2, 0, 5, - 0, 1, 0, 5, 3, 1, 3, 3, 0, 1, - 1, 0, 2, 2, 0, 2, 2, 4, 3, 3, - 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, - 3, 5, 1, 3, 2, 1, 1, 1, 2, 5, - 1, 3, 2, 1, 1, 1, 1, 1, 2, 2, - 1, 2, 2, 1, 2, 2, 1, 2, 2, 9, - 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 2, 0, 4, 7, 6, - 6, 3, 5, 0, 2, 0, 2, 1, 3, 1, - 2, 3, 5, 0, 1, 2, 1, 3, 1, 4, - 1, 1, 1, 4, 4, 4, 3, 4, 5, 3, - 2, 2, 2, 2, 2, 3, 2, 3, 2, 3, - 2, 2, 3, 4, 0, 2, 4, 1, 3, 4, - 1, 3, 1, 1, 2, 2, 3, 0, 1, 2, - 4, 1, 3, 1, 3, 2, 3, 1, 10, 4, - 1, 3, 3, 5, 5, 7, 0, 1, 1, 1, - 2, 0, 4, 4, 0, 3, 0, 3, 3, 0, - 1, 1, 2, 5, 2, 2, 2, 0, 2, 3, - 3, 0, 1, 3, 1, 3, 0, 1, 2, 1, - 1, 0, 1, 2, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 4, 5, 5, 4, 4, + 4, 1, 3, 1, 4, 6, 6, 5, 4, 4, + 3, 7, 3, 5, 1, 1, 2, 2, 12, 9, + 10, 1, 3, 2, 4, 0, 2, 0, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 1, 1, 6, + 2, 1, 5, 4, 4, 2, 1, 2, 1, 2, + 4, 5, 5, 1, 2, 4, 0, 2, 1, 2, + 2, 6, 5, 9, 6, 6, 6, 7, 0, 2, + 1, 2, 8, 10, 1, 2, 7, 5, 13, 13, + 10, 10, 1, 0, 2, 1, 3, 2, 1, 5, + 4, 4, 2, 0, 1, 5, 4, 0, 1, 3, + 3, 1, 3, 1, 3, 5, 1, 3, 3, 5, + 1, 3, 4, 0, 1, 0, 1, 1, 3, 1, + 1, 0, 4, 0, 4, 4, 3, 5, 1, 3, + 2, 1, 0, 10, 2, 0, 2, 0, 2, 0, + 4, 7, 4, 0, 2, 0, 2, 0, 2, 0, + 4, 1, 3, 3, 1, 1, 1, 1, 4, 7, + 4, 6, 4, 5, 6, 8, 4, 6, 5, 6, + 0, 1, 4, 8, 0, 6, 0, 4, 0, 4, + 6, 1, 1, 1, 1, 1, 2, 3, 1, 3, + 6, 0, 3, 0, 1, 0, 1, 1, 2, 4, + 4, 2, 0, 5, 0, 1, 0, 5, 3, 1, + 3, 3, 0, 1, 1, 0, 2, 2, 0, 2, + 2, 4, 3, 3, 1, 1, 1, 3, 3, 3, + 3, 3, 3, 3, 3, 5, 1, 3, 2, 1, + 1, 1, 2, 5, 1, 3, 2, 1, 1, 1, + 1, 1, 2, 2, 1, 2, 2, 1, 2, 2, + 1, 2, 2, 9, 0, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, + 0, 4, 7, 6, 6, 3, 5, 0, 2, 0, + 2, 1, 3, 1, 2, 3, 5, 0, 1, 2, + 1, 3, 1, 4, 1, 1, 1, 4, 4, 4, + 3, 4, 5, 3, 2, 2, 2, 2, 2, 3, + 2, 3, 2, 3, 2, 2, 3, 4, 0, 2, + 4, 1, 3, 4, 1, 3, 1, 1, 2, 2, + 3, 0, 1, 2, 4, 1, 3, 1, 3, 2, + 3, 1, 10, 4, 1, 3, 3, 5, 5, 7, + 0, 1, 1, 1, 2, 0, 4, 4, 0, 3, + 0, 3, 3, 0, 1, 1, 2, 5, 2, 2, + 2, 0, 2, 3, 3, 0, 1, 3, 1, 3, + 0, 1, 2, 1, 1, 0, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 6, 6, 10, 0, 3, 0, 2, 0, 4, 1, - 1, 0, 2, 0, 2, 7, 1, 1, 9, 1, - 3, 0, 1, 1, 3, 1, 3, 0, 1, 1, - 1, 0, 2, 14, 1, 3, 0, 1, 1, 3, - 1, 1, 2, 4, 1, 1, 1, 1, 0, 1, - 2, 9, 9, 7, 8, 1, 2, 3, 3, 3, - 0, 4, 1, 1, 1, 1, 1, 0, 1, 1, - 1, 1, 1, 4, 1, 1, 1, 3, 3, 4, - 3, 3, 0, 1, 1, 1, 0, 2, 7, 8, - 10, 8, 2, 2, 8, 0, 3, 3, 0, 3, - 0, 3, 0, 3, 0, 5, 1, 3, 0, 3, - 3, 0, 2, 9, 8, 0, 2, 2, 3, 3, - 0, 2, 0, 2, 4, 5, 4, 4, 4, 6, - 4, 8, 5, 1, 0, 2, 2, 1, 3, 2, - 1, 3, 2, 1, 3, 2, 0, 1, 3, 4, - 3, 1, 1, 4, 1, 3, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 6, 6, 10, 0, 3, + 0, 2, 0, 4, 1, 1, 0, 2, 0, 2, + 7, 1, 1, 9, 1, 3, 0, 1, 1, 3, + 1, 3, 0, 1, 1, 1, 0, 2, 14, 1, + 3, 0, 1, 1, 3, 1, 1, 2, 4, 1, + 1, 1, 1, 0, 1, 2, 8, 2, 5, 1, + 1, 1, 1, 4, 5, 5, 3, 5, 5, 9, + 9, 7, 8, 1, 2, 3, 3, 3, 0, 4, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, - 11, 0, 2, 0, 2, 1, 1, 3, 3, 2, - 2, 3, 1, 1, 3, 3, 3, 3, 3, 3, - 4, 2, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 1, 1, 1, 3, 3, 3, 3, 3, 1, - 3, 3, 4, 0, 1, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 6, 8, 10, 0, 4, 1, - 1, 0, 3, 3, 0, 1, 0, 1, 1, 2, - 4, 4, 4, 0, 1, 4, 4, 4, 0, 2, - 8, 9, 5, 5, 8, 7, 8, 12, 12, 13, - 13, 0, 4, 0, 3, 3, 3, 2, 2, 0, - 3, 3, 3, 4, 4, 0, 3, 0, 2, 0, - 1, 1, 1, 1, 11, 9, 9, 9, 9, 9, - 9, 6, 11, 6, 9, 7, 10, 8, 11, 7, - 6, 9, 11, 2, 2, 9, 4, 5, 3, 0, - 4, 1, 3, 0, 3, 6, 0, 2, 10, 0, - 2, 0, 2, 0, 3, 2, 4, 3, 0, 2, - 1, 0, 2, 3, 0, 2, 3, 0, 2, 1, - 0, 3, 2, 4, 3, 0, 1, 0, 1, 1, - 0, 6, 0, 3, 5, 0, 4, 0, 3, 1, - 3, 4, 5, 0, 3, 1, 3, 2, 3, 1, - 2, 1, 0, 4, 6, 5, 0, 2, 0, 2, - 4, 5, 4, 5, 1, 5, 6, 5, 0, 3, - 0, 1, 4, 0, 4, 1, 3, 3, 1, 1, - 1, 1, 4, 0, 4, 1, 3, 3, 1, 1, - 1, 1, 4, 0, 4, 1, 3, 3, 4, 4, - 0, 4, 1, 3, 3, 1, 1, 0, 4, 1, - 3, 3, 1, 1, 1, 1, 0, 1, 1, 3, - 2, 3, 3, 3, 3, 4, 4, 3, 3, 3, - 3, 4, 4, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, - 3, 3, 3, 3, 1, 5, 4, 1, 3, 3, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 3, 5, 0, 3, 3, 6, - 5, 3, 1, 1, 1, 0, 5, 5, 5, 5, - 6, 0, 1, 1, 3, 1, 1, 1, 1, 1, - 7, 9, 7, 7, 9, 2, 1, 7, 9, 7, - 9, 8, 5, 0, 1, 0, 1, 1, 1, 1, - 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1, 3, 1, - 3, 5, 1, 1, 1, 1, 1, 1, 3, 5, - 0, 1, 1, 2, 1, 2, 2, 2, 1, 1, - 2, 2, 2, 2, 2, 3, 3, 2, 2, 1, - 5, 6, 4, 2, 1, 1, 1, 5, 7, 5, - 0, 1, 1, 1, 2, 2, 0, 1, 1, 2, - 5, 0, 1, 1, 2, 2, 3, 3, 1, 1, - 2, 2, 2, 0, 1, 2, 2, 2, 0, 4, - 7, 3, 3, 3, 0, 3, 0, 3, 1, 1, - 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, - 1, 1, 1, 3, 3, 5, 2, 2, 2, 2, - 2, 4, 1, 1, 2, 5, 6, 10, 8, 6, - 3, 6, 6, 1, 1, 1, 1, 1, 1, 3, - 9, 1, 1, 1, 4, 4, 4, 4, 5, 4, - 6, 8, 10, 6, 8, 10, 6, 6, 9, 7, - 9, 7, 7, 7, 9, 7, 7, 0, 2, 0, - 1, 1, 2, 4, 1, 2, 2, 1, 1, 2, - 2, 5, 1, 2, 2, 2, 2, 2, 0, 1, - 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 1, 1, 1, 2, 5, 0, 1, 3, 0, - 1, 0, 2, 0, 2, 0, 1, 2, 4, 4, - 0, 1, 0, 2, 1, 3, 5, 9, 6, 6, - 8, 6, 6, 5, 5, 6, 6, 6, 6, 6, - 5, 6, 6, 6, 6, 6, 6, 6, 6, 9, - 6, 6, 6, 6, 8, 1, 1, 1, 4, 6, - 4, 6, 8, 6, 6, 4, 6, 4, 4, 4, - 3, 4, 6, 6, 7, 4, 1, 1, 1, 1, + 1, 4, 1, 1, 1, 3, 3, 4, 3, 3, + 0, 1, 1, 1, 0, 2, 7, 8, 10, 8, + 2, 2, 8, 0, 3, 3, 0, 3, 0, 3, + 0, 3, 0, 5, 1, 3, 0, 3, 3, 0, + 2, 9, 8, 0, 2, 2, 3, 3, 0, 2, + 0, 2, 4, 5, 4, 4, 4, 6, 4, 8, + 5, 1, 0, 2, 2, 1, 3, 2, 1, 3, + 2, 1, 3, 2, 0, 1, 3, 4, 3, 1, + 1, 4, 1, 3, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 1, 11, 0, + 2, 0, 2, 1, 1, 3, 3, 2, 2, 3, + 1, 1, 3, 3, 3, 3, 3, 3, 4, 2, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 1, + 1, 1, 3, 3, 3, 3, 3, 1, 3, 3, + 4, 0, 1, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 6, 8, 10, 0, 4, 1, 1, 0, + 3, 3, 0, 1, 0, 1, 1, 2, 4, 4, + 4, 0, 1, 4, 4, 4, 0, 2, 8, 9, + 5, 5, 8, 7, 8, 12, 12, 13, 13, 0, + 4, 0, 3, 3, 3, 2, 2, 0, 3, 3, + 3, 4, 4, 0, 3, 0, 2, 0, 1, 1, + 1, 1, 11, 9, 9, 9, 9, 9, 9, 6, + 11, 6, 9, 7, 10, 8, 11, 7, 6, 9, + 11, 2, 2, 9, 4, 5, 3, 0, 4, 1, + 3, 0, 3, 6, 0, 2, 10, 0, 2, 0, + 2, 0, 3, 2, 4, 3, 0, 2, 1, 0, + 2, 3, 0, 2, 3, 0, 2, 1, 0, 3, + 2, 4, 3, 0, 1, 0, 1, 1, 0, 6, + 0, 3, 5, 0, 4, 0, 3, 1, 3, 4, + 5, 0, 3, 1, 3, 2, 3, 1, 2, 1, + 0, 4, 6, 5, 0, 2, 0, 2, 4, 5, + 4, 5, 1, 5, 6, 5, 0, 3, 0, 1, + 4, 0, 4, 1, 3, 3, 1, 1, 1, 1, + 4, 0, 4, 1, 3, 3, 1, 1, 1, 1, + 4, 0, 4, 1, 3, 3, 4, 4, 0, 4, + 1, 3, 3, 1, 1, 0, 4, 1, 3, 3, + 1, 1, 1, 1, 0, 1, 1, 3, 2, 3, + 3, 3, 3, 4, 4, 3, 3, 3, 3, 4, + 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, + 3, 3, 1, 5, 4, 1, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 3, 5, 0, 3, 3, 6, 5, 3, + 1, 1, 1, 0, 5, 5, 5, 5, 6, 0, + 1, 1, 3, 1, 1, 1, 1, 1, 7, 9, + 7, 7, 9, 2, 1, 7, 9, 7, 9, 8, + 5, 0, 1, 0, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 3, 1, 3, 5, + 1, 1, 1, 1, 1, 1, 3, 5, 0, 1, + 1, 2, 1, 2, 2, 2, 1, 1, 2, 2, + 2, 2, 2, 3, 3, 2, 2, 1, 5, 6, + 4, 2, 1, 1, 1, 5, 7, 5, 0, 1, + 1, 1, 2, 2, 0, 1, 1, 2, 5, 0, + 1, 1, 2, 2, 3, 3, 1, 1, 2, 2, + 2, 0, 1, 2, 2, 2, 0, 4, 7, 3, + 3, 3, 0, 3, 0, 3, 1, 1, 1, 1, + 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, + 1, 3, 3, 5, 2, 2, 2, 2, 2, 4, + 1, 1, 2, 5, 6, 10, 8, 6, 3, 6, + 6, 1, 1, 1, 1, 1, 1, 3, 9, 1, + 1, 1, 4, 4, 4, 4, 5, 4, 6, 8, + 10, 6, 8, 10, 6, 6, 9, 7, 9, 7, + 7, 7, 9, 7, 7, 0, 2, 0, 1, 1, + 2, 4, 1, 2, 2, 1, 1, 2, 2, 5, + 1, 2, 2, 2, 2, 2, 0, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, + 1, 1, 2, 5, 0, 1, 3, 0, 1, 0, + 2, 0, 2, 0, 1, 2, 4, 4, 0, 1, + 0, 2, 1, 3, 5, 9, 6, 6, 8, 6, + 6, 5, 5, 6, 6, 6, 6, 6, 5, 6, + 6, 6, 6, 6, 6, 6, 6, 9, 6, 6, + 6, 6, 8, 1, 1, 1, 4, 6, 4, 6, + 8, 6, 6, 4, 6, 4, 4, 4, 3, 4, + 6, 6, 7, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 2, 8, 8, 6, - 4, 2, 3, 2, 4, 2, 2, 4, 6, 2, - 2, 4, 6, 4, 2, 4, 4, 4, 0, 1, - 2, 3, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 8, 8, 6, 4, 2, + 3, 2, 4, 2, 2, 4, 6, 2, 2, 4, + 6, 4, 2, 4, 4, 4, 0, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 0, 1, 1, - 3, 0, 1, 1, 3, 1, 3, 3, 3, 3, - 2, 1, 1, 1, 3, 4, 4, 3, 4, 4, - 3, 4, 4, 3, 4, 4, 3, 4, 1, 3, - 4, 4, 6, 4, 5, 5, 4, 5, 5, 3, - 4, 4, 5, 6, 6, 1, 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, - 2, 3, 1, 1, 1, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 3, 2, 2, 2, 2, 1, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, - 2, 1, 1, 1, 2, 1, 1, 1, 1, 2, - 2, 2, 2, 2, 2, 4, 4, 1, 2, 2, - 7, 8, 3, 5, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 0, 1, 1, 3, 0, + 1, 1, 3, 1, 3, 3, 3, 3, 2, 1, + 1, 1, 3, 4, 4, 3, 4, 4, 3, 4, + 4, 3, 4, 4, 3, 4, 1, 3, 4, 4, + 6, 4, 5, 5, 4, 5, 5, 3, 4, 4, + 5, 6, 6, 1, 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 0, 1, 0, 3, 0, - 3, 3, 0, 3, 5, 0, 3, 5, 0, 1, - 1, 0, 1, 1, 2, 2, 0, 1, 1, 1, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 1, 2, 3, + 1, 1, 1, 4, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 2, 2, 2, 2, 1, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, + 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, + 2, 2, 2, 4, 4, 1, 2, 2, 7, 8, + 3, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 0, 1, 0, 3, 0, 3, 3, + 0, 3, 5, 0, 3, 5, 0, 1, 1, 0, + 1, 1, 2, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -13759,557 +13847,563 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 2, 0, 2, 5, 7, 1, - 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, + 2, 5, 7, 1, 3, } var yyChk = [...]int{ - -1000, -756, -760, -12, -8, -9, -11, -154, -117, 732, - -14, -23, -156, -142, -157, -15, -151, -17, -18, -19, - -213, -21, -124, -146, -148, -150, -149, -62, -20, -143, - -144, -145, -102, -103, -127, -135, -138, -139, -140, -141, - -158, -152, -153, -155, -245, -159, -168, -169, -220, -172, - -174, -175, -208, -209, -239, 721, -118, -119, -120, -121, - -122, -123, -43, -42, -41, -40, -200, -210, -214, -216, - -170, -57, 637, 727, 766, 538, -16, -699, -638, 591, - -24, -25, -112, -26, 278, 305, -480, -125, -481, -482, - -484, -761, -63, -64, -65, -78, -79, -80, -81, -82, - -92, -93, -94, -66, -67, -68, -71, -69, -85, -84, - -86, -87, -88, -89, -90, -91, -70, -74, -203, -204, - -205, -206, -95, -72, -73, -218, -221, -171, -96, -97, - -98, -75, -60, -61, -76, -77, -100, -99, -105, -111, - -101, -106, -202, -212, -22, -219, -107, -59, -109, -110, - -108, 279, 350, 298, -104, 86, -128, -129, -130, -131, - -132, -133, -134, -136, -137, 463, 469, 525, 719, 720, - 71, -247, -249, -251, 768, 769, 772, 622, 624, 323, - 186, 187, 189, 190, 194, 197, -44, -45, -46, -47, - -48, -49, -51, -50, -52, -53, -54, -55, -56, 274, - 22, 20, 24, 64, -27, -30, -28, -31, -29, -38, - -39, -37, -32, -34, -201, -207, -33, -211, -215, -217, - -173, -58, -35, -36, 300, 299, 47, 366, 367, 368, - 467, 275, 277, 23, 40, 51, 442, -250, -254, 96, - -257, -253, 623, 276, -252, -256, 21, 284, 786, -13, - -10, -9, -187, -191, -195, -198, -199, -196, -197, -11, - -154, 131, 290, 722, -476, 459, 723, 725, 724, 99, - 107, -469, -471, 766, 538, 305, 463, 469, 719, 720, - 769, 772, 622, 624, 323, 639, 640, 641, 642, 643, - 644, 645, 646, 648, 649, 650, 651, 652, 653, 654, - 697, 698, 664, 665, 655, 656, 657, 658, 659, 660, - 661, 662, 666, 667, 668, 669, 670, 671, 672, 673, - 674, 675, 676, 677, 678, 679, 594, 595, 699, 701, - 702, 703, 704, 647, 684, 692, 693, 694, 777, 778, - 440, 6, 7, 8, 9, 10, 441, 630, 716, 775, - 317, 341, 492, 347, 354, 421, 186, 204, 200, 229, - 219, 427, 373, 745, 746, 372, 623, 195, 321, 359, - 322, 106, 189, 577, 121, 550, 521, 192, 379, 382, - 380, 381, 336, 338, 340, 453, 343, 342, 344, 346, - 621, 377, 443, 215, 209, 335, 319, 207, 324, 428, - 49, 325, 419, 418, 234, 326, 327, 634, 546, 439, - 552, 351, 62, 519, 208, 339, 549, 715, 242, 246, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 568, 425, 406, 407, 408, 409, 569, 430, 177, 178, - 554, 744, 751, 752, 753, 755, 756, 757, 754, 424, - 571, 429, 233, 236, 237, 238, 239, 240, 241, 297, - 415, 416, 431, 432, 433, 434, 435, 437, 438, 52, - 632, 309, 572, 244, 762, 223, 232, 227, 580, 355, - 353, 420, 231, 203, 226, 320, 784, 767, 75, 248, - 247, 249, 515, 516, 517, 518, 328, 329, 457, 567, - 747, 748, 222, 210, 444, 196, 31, 575, 304, 551, - 470, 383, 57, 384, 330, 348, 356, 378, 243, 245, - 311, 316, 371, 426, 633, 523, 524, 315, 559, 560, - 352, 573, 206, 308, 337, 303, 576, 763, 749, 197, - 783, 472, 331, 190, 345, 570, 765, 579, 74, 172, - 202, 193, 739, 740, 294, 700, 187, 313, 318, 717, - 764, 332, 333, 334, 358, 357, 349, 194, 224, 310, - 230, 213, 201, 225, 188, 312, 578, 173, 713, 442, - 502, 221, 218, 314, 287, 718, 574, 553, 191, 506, - 175, 216, 360, 707, 708, 709, 712, 458, 414, 361, - 362, 214, 301, 544, 545, 365, 512, 401, 486, 522, - 493, 487, 265, 266, 369, 556, 558, 235, 710, 385, - 386, 387, 548, 388, 389, 390, 391, 396, 462, 66, - 68, 108, 111, 110, 770, 771, 73, 38, 448, 451, - 484, 785, 488, 403, 714, 631, 400, 404, 405, 452, - 34, 504, 474, 508, 507, 58, 59, 60, 63, 64, - 65, 67, 69, 70, 61, 620, 467, 481, 581, 54, - 56, 477, 478, 36, 454, 503, 526, 399, 505, 537, - 55, 535, 536, 557, 35, 456, 455, 72, 53, 511, - 513, 514, 363, 397, 465, 728, 582, 460, 476, 480, - 461, 402, 450, 482, 77, 473, 729, 468, 466, 779, - 780, 398, 635, 636, 410, 663, 445, 520, 617, 616, - 615, 614, 613, 612, 611, 610, 366, 367, 368, 489, - 490, 491, 501, 494, 495, 496, 497, 498, 499, 500, - 540, 541, 730, 731, 561, 563, 564, 628, 565, 562, - 282, 774, 773, 446, 447, 285, 733, 734, 109, 735, - 737, 736, 37, 738, 761, 758, 759, 760, 638, 566, - 625, 741, 627, 626, 685, 686, 687, 688, 689, -565, - -563, -476, 623, 323, 766, 719, 720, 469, 622, 624, - 463, 442, 769, 772, 64, 467, 305, 366, 367, 368, - 538, 440, -324, -476, 284, 773, -104, -25, -24, -16, - -638, -112, -250, -251, -765, 271, 273, 478, -339, 284, - -476, -485, 32, 519, 279, 280, -126, 520, 96, 87, - -476, -17, -140, -15, -151, -102, -245, -699, 525, -483, - -476, 366, 366, 628, -483, 284, 284, 743, 524, 565, - 628, 744, 751, 762, 560, 453, 110, 111, 739, 740, - 36, 284, 464, 311, 558, 556, 557, 561, 562, 563, - 564, -83, -650, -626, 553, 644, 552, -489, 545, 551, - 543, 555, 546, 441, 391, 388, 637, 390, 395, 274, - 733, 619, -464, 486, 522, 581, 582, 465, 523, 568, - 570, 547, 121, 220, 217, -478, 315, 500, -476, -627, - 290, -569, -540, 316, -568, -542, -571, -543, 41, 274, - 276, 275, 637, 312, 24, 467, 286, 22, 21, 468, - 298, 34, 35, 37, 23, 469, 471, 38, 472, 475, - 476, 477, 51, 481, 482, 305, 99, 107, 102, 685, - 686, 687, 688, 689, 323, 284, -323, -476, -511, -503, - 128, -506, -498, -499, -501, -454, -671, -496, 96, 157, - 158, 165, 129, 167, 787, -500, -608, 45, 131, 643, - 647, 684, 592, -446, -447, -448, -449, -450, -451, 629, - -476, -672, -670, 102, 112, 114, 118, 119, 117, 115, - 180, 211, 116, 103, 181, -251, 99, -693, 653, 659, - -470, 676, 701, 702, 703, 704, 675, 71, -634, -648, - 283, -646, 179, 217, 301, 213, 22, 163, 512, 214, - 692, 693, 694, 650, 672, 594, 595, 699, 654, 777, - 778, 664, 679, 645, 646, 648, 640, 641, 642, 644, - 655, 657, 671, -649, 667, 677, 678, 663, 695, 696, - 758, 697, 698, 680, 681, 682, 691, 690, 683, 685, - 686, 687, 688, 689, 737, 101, 100, 670, 669, 656, - 651, 652, 658, 639, 649, 660, 668, 673, 674, 451, - 121, 452, 453, 584, 443, 90, 454, 290, 519, 9, - 80, 455, 456, 457, 458, 243, 459, 591, 460, 783, - 81, 461, 450, 305, 502, 462, 216, 235, 597, 596, - 598, 588, 585, 583, 586, 587, 589, 590, 661, 662, - 666, -248, -250, -699, -251, -176, -178, 705, -749, -287, - -750, -436, 31, -751, 12, 13, 14, 15, 181, -740, - 521, 633, 102, 584, 284, 359, 440, 25, 743, 395, - 621, 743, 395, 621, 373, 191, 188, -555, 191, 127, - 197, 196, 288, 191, -555, -476, 194, 743, 193, 739, - 744, 751, 628, 369, -527, -224, 440, 502, 388, 108, - 315, -532, -528, -628, 363, 359, 285, 124, -225, 295, - 436, 294, 122, 584, 283, 479, 354, 66, 68, 41, - 54, -271, 57, 289, 48, -339, -701, 618, -700, -476, - -709, -710, 271, 272, 273, 48, 744, 751, 285, 287, - 284, 739, 628, 315, 440, -528, 502, 108, 388, 284, - -709, 762, 188, 568, 570, 521, 315, 500, 50, -562, - 512, -561, -563, 569, 580, 100, 101, 567, -464, 121, - 544, 544, -749, -436, -750, -282, -436, -281, 17, -247, - -251, -254, -258, -699, -260, 71, 621, 743, 628, 744, - 751, 285, 440, 502, 315, 286, -628, 287, 584, 283, - 366, 464, 311, 388, 395, 108, 193, 739, -264, -265, - -266, 267, 268, 269, 79, 272, 270, 76, 41, 42, - 43, -339, -8, 135, 786, -503, -503, -13, 789, -13, - -503, -476, -476, 183, -346, -350, -347, -349, -348, 775, - -352, -351, 217, 218, 179, 221, 223, 228, 224, 225, - 226, 227, 229, 230, 231, 232, 233, 236, 237, 238, - 239, 240, 241, 234, 40, 235, 301, 213, 214, 215, - 216, -355, 200, 219, 631, 260, 201, 261, 202, 262, - 203, 263, 177, 178, 264, 204, 207, 208, 209, 210, - 206, 242, 243, 244, 245, 246, 247, 248, 249, 251, - 250, 252, 253, 254, 255, 256, 257, 258, 259, 182, - -307, 102, 41, 96, 182, -339, 102, -749, -281, -282, - -287, -271, 25, -339, -330, 182, 787, -452, -476, 521, - 138, 519, -126, 520, 87, 519, -126, 520, 279, -126, - 87, -702, -703, -704, -706, 279, 520, 519, 280, 350, - -149, 182, 323, 25, -483, -483, -476, 93, -308, -309, - -339, -341, -339, -733, -732, 41, 628, -312, 32, 566, - 746, 748, 544, 754, 763, 764, 765, 92, -488, 146, - 150, -488, -432, 26, -432, 32, 32, 313, 313, 313, - -488, 353, -762, -763, 25, 148, -486, -763, -486, -486, - -488, -764, 286, 554, 52, 314, 313, -284, -285, 30, - 96, -284, 548, 544, -591, 549, 550, -490, -763, -489, - -488, -488, -489, -488, -488, 394, -488, 41, 389, 390, - 284, 287, 584, 388, 734, -762, -762, 40, 40, -542, - 315, -569, -540, 45, 92, 183, 288, 183, 92, 96, - 465, 440, 502, 466, 584, 284, 479, 287, 315, 480, - 440, 502, 284, 287, 584, 315, 440, 284, 287, 502, - 315, 480, 440, 543, 544, 287, 36, 470, 473, 474, - 544, -654, 580, -339, 183, 127, 124, 126, -503, 145, - -518, 138, 139, 140, 141, 142, 143, 144, 152, 151, - 164, 157, 158, 159, 160, 161, 162, 163, 153, 154, - 155, 156, 148, 128, 167, 784, 146, 150, 147, 130, - 125, 170, 169, -251, -503, -511, 71, -501, -501, -501, - -501, -501, -476, -608, -508, -503, 96, 96, 96, 96, - 96, 182, 115, 102, 96, -503, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, -647, - 96, 96, -515, -516, 96, 96, -496, -452, 96, 102, - 102, 96, 96, 96, 102, 96, 96, 96, -516, -516, + -1000, -763, -767, -12, -8, -9, -11, -161, -124, 732, + -14, -23, -163, -149, -164, -15, -158, -17, -18, -19, + -220, -21, -131, -153, -155, -157, -156, -69, -66, -63, + -20, -150, -151, -152, -109, -110, -134, -142, -145, -146, + -147, -148, -165, -159, -160, -162, -252, -166, -175, -176, + -227, -179, -181, -182, -215, -216, -246, 721, -125, -126, + -127, -128, -129, -130, -43, -42, -41, -40, -207, -217, + -221, -223, -177, -57, 637, 727, 766, 538, -16, -706, + -645, 591, -24, -25, -119, -26, 278, 305, -487, -132, + -488, -489, -491, -768, -70, -71, -72, -85, -86, -87, + -88, -89, -99, -100, -101, -73, -74, -75, -78, -76, + -92, -91, -93, -94, -95, -96, -97, -98, -77, -81, + -210, -211, -212, -213, -102, -79, -80, -225, -228, -178, + -103, -104, -105, -82, -60, -61, -83, -84, 298, 769, + -107, -106, -112, -118, -108, -113, -209, -219, -22, -226, + -114, -59, -65, -116, -117, -115, 279, 350, -111, 86, + -135, -136, -137, -138, -139, -140, -141, -143, -144, 463, + 469, 525, 719, 720, 71, -254, -256, -258, 774, 775, + 778, 622, 624, 323, 186, 187, 189, 190, 194, 197, + -44, -45, -46, -47, -62, -48, -49, -51, -50, -52, + -53, -54, -55, -56, 274, 22, 20, 24, 64, -27, + -30, -28, -31, -29, -38, -39, -37, -32, -34, -208, + -214, -33, -218, -222, -224, -180, -58, -64, -35, -36, + 300, 299, 47, 366, 367, 368, 467, 275, 277, 23, + 40, 51, 442, -257, -261, 96, -264, -260, 623, 276, + -259, -263, 21, 284, 792, -13, -10, -9, -194, -198, + -202, -205, -206, -203, -204, -11, -161, 131, 290, 722, + -483, 459, 723, 725, 724, 99, 107, -476, -478, 766, + 538, 305, 769, 463, 469, 719, 720, 775, 778, 622, + 624, 323, 639, 640, 641, 642, 643, 644, 645, 646, + 648, 649, 650, 651, 652, 653, 654, 697, 698, 664, + 665, 655, 656, 657, 658, 659, 660, 661, 662, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 594, 595, 699, 701, 702, 703, 704, + 647, 684, 692, 693, 694, 783, 784, 768, 770, 771, + 772, 773, 440, 6, 7, 8, 9, 10, 441, 630, + 716, 781, 317, 341, 492, 347, 354, 421, 186, 204, + 200, 229, 219, 427, 373, 745, 746, 372, 623, 195, + 321, 359, 322, 106, 189, 577, 121, 550, 521, 192, + 379, 382, 380, 381, 336, 338, 340, 453, 343, 342, + 344, 346, 621, 377, 443, 215, 209, 335, 319, 207, + 324, 428, 49, 325, 419, 418, 234, 326, 327, 634, + 546, 439, 552, 351, 62, 519, 208, 339, 549, 715, + 242, 246, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 568, 425, 406, 407, 408, 409, 569, 430, + 177, 178, 554, 744, 751, 752, 753, 755, 756, 757, + 754, 424, 571, 429, 233, 236, 237, 238, 239, 240, + 241, 297, 415, 416, 431, 432, 433, 434, 435, 437, + 438, 52, 632, 309, 572, 244, 762, 223, 232, 227, + 580, 355, 353, 420, 231, 203, 226, 320, 790, 767, + 75, 248, 247, 249, 515, 516, 517, 518, 328, 329, + 457, 567, 747, 748, 222, 210, 444, 196, 31, 575, + 304, 551, 470, 383, 57, 384, 330, 348, 356, 378, + 243, 245, 311, 316, 371, 426, 633, 523, 524, 315, + 559, 560, 352, 573, 206, 308, 337, 303, 576, 763, + 749, 197, 789, 472, 331, 190, 345, 570, 765, 579, + 74, 172, 202, 193, 739, 740, 294, 700, 187, 313, + 318, 717, 764, 332, 333, 334, 358, 357, 349, 194, + 224, 310, 230, 213, 201, 225, 188, 312, 578, 173, + 713, 442, 502, 221, 218, 314, 287, 718, 574, 553, + 191, 506, 175, 216, 360, 707, 708, 709, 712, 458, + 414, 361, 362, 214, 301, 544, 545, 365, 512, 401, + 486, 522, 493, 487, 265, 266, 369, 556, 558, 235, + 710, 385, 386, 387, 548, 388, 389, 390, 391, 396, + 462, 66, 68, 108, 111, 110, 776, 777, 73, 38, + 448, 451, 484, 791, 488, 403, 714, 631, 400, 404, + 405, 452, 34, 504, 474, 508, 507, 58, 59, 60, + 63, 64, 65, 67, 69, 70, 61, 620, 467, 481, + 581, 54, 56, 477, 478, 36, 454, 503, 526, 399, + 505, 537, 55, 535, 536, 557, 35, 456, 455, 72, + 53, 511, 513, 514, 363, 397, 465, 728, 582, 460, + 476, 480, 461, 402, 450, 482, 77, 473, 729, 468, + 466, 785, 786, 398, 635, 636, 410, 663, 445, 520, + 617, 616, 615, 614, 613, 612, 611, 610, 366, 367, + 368, 489, 490, 491, 501, 494, 495, 496, 497, 498, + 499, 500, 540, 541, 730, 731, 561, 563, 564, 628, + 565, 562, 282, 780, 779, 446, 447, 285, 733, 734, + 109, 735, 737, 736, 37, 738, 761, 758, 759, 760, + 638, 566, 625, 741, 627, 626, 685, 686, 687, 688, + 689, -572, -570, -483, 769, 623, 323, 766, 719, 720, + 469, 622, 624, 463, 442, 775, 778, 64, 467, 305, + 366, 367, 368, 538, 440, -331, -483, 284, 779, -111, + -25, -24, -16, -645, -119, -257, -258, -772, 271, 273, + 478, -346, 284, -483, -492, 32, 519, 279, 280, -133, + 520, 96, 87, -483, -17, -147, -15, -158, -109, -252, + -706, 525, -490, -483, 366, 366, 628, -490, 743, 524, + 565, 628, 744, 751, 762, 560, 453, 110, 111, 739, + 740, 36, 284, 464, 311, 558, 556, 557, 561, 562, + 563, 564, -90, -657, -633, 553, 644, 552, -496, 545, + 551, 543, 555, 546, 441, 391, 388, 637, 390, 395, + 274, 733, 768, 619, -471, 486, 522, 581, 582, 465, + 523, 568, 570, 547, 121, 220, 217, 768, 284, 284, + -485, 315, 500, -483, -634, 290, -576, -547, 316, -575, + -549, -578, -550, 41, 274, 276, 275, 637, 312, 24, + 467, 286, 22, 21, 468, 298, 34, 35, 37, 23, + 469, 471, 38, 472, 475, 476, 477, 51, 481, 482, + 305, 99, 107, 102, 685, 686, 687, 688, 689, 323, + 284, -330, -483, -518, -510, 128, -513, -505, -506, -508, + -461, -678, -503, 96, 157, 158, 165, 129, 167, 793, + -507, -615, 45, 131, 643, 647, 684, 592, -453, -454, + -455, -456, -457, -458, 629, -483, -679, -677, 102, 112, + 114, 118, 119, 117, 115, 180, 211, 116, 103, 181, + -258, 99, -700, 653, 659, -477, 676, 701, 702, 703, + 704, 675, 71, -641, -655, 283, -653, 179, 217, 301, + 213, 22, 163, 512, 214, 692, 693, 694, 650, 672, + 594, 595, 699, 654, 783, 784, 664, 679, 645, 646, + 648, 640, 641, 642, 644, 655, 657, 671, -656, 667, + 677, 678, 663, 695, 696, 758, 697, 698, 680, 681, + 682, 691, 690, 683, 685, 686, 687, 688, 689, 737, + 101, 100, 670, 669, 656, 651, 652, 658, 639, 649, + 660, 668, 673, 674, 451, 121, 452, 453, 584, 443, + 90, 454, 290, 519, 9, 80, 455, 456, 457, 458, + 243, 459, 591, 460, 789, 81, 461, 450, 305, 502, + 462, 216, 235, 597, 596, 598, 588, 585, 583, 586, + 587, 589, 590, 661, 662, 666, -255, -257, -706, -258, + -183, -185, 705, -756, -294, -757, -443, 31, -758, 12, + 13, 14, 15, 181, -747, 521, 633, 102, 584, 284, + 359, 440, 25, 743, 395, 621, 743, 395, 621, 373, + 191, 188, -562, 191, 127, 197, 196, 288, 191, -562, + -483, 194, 743, 193, 739, 744, 751, 628, 369, -534, + 768, -231, 440, 502, 388, 108, 315, -539, -535, -635, + 363, 359, 285, 124, -232, 295, 436, 294, 122, 584, + 283, 479, 354, 66, 68, 41, 54, -278, 57, 289, + 48, -346, -708, 618, -707, -483, -716, -717, 271, 272, + 273, 48, 744, 751, 285, 287, 284, 739, 628, 315, + 440, -535, 502, 768, 108, 388, 284, -716, 762, 188, + 568, 570, 521, 315, 500, 50, -569, 512, -568, -570, + 569, 580, 100, 101, 567, -471, 121, 544, 544, -756, + -443, -757, -289, -443, -288, 17, -254, -258, -261, -265, + -706, -267, 71, 621, 743, 628, 744, 751, 285, 440, + 502, 315, 286, -635, 287, 584, 283, 366, 464, 311, + 768, 388, 395, 108, 193, 739, -271, -272, -273, 267, + 268, 269, 79, 272, 270, 76, 41, 42, 43, -346, + -8, 135, 792, -510, -510, -13, 795, -13, -510, -483, + -483, 183, -353, -357, -354, -356, -355, 781, -359, -358, + 217, 218, 179, 221, 223, 228, 224, 225, 226, 227, + 229, 230, 231, 232, 233, 236, 237, 238, 239, 240, + 241, 234, 40, 235, 301, 213, 214, 215, 216, -362, + 200, 219, 631, 260, 201, 261, 202, 262, 203, 263, + 177, 178, 264, 204, 207, 208, 209, 210, 206, 242, + 243, 244, 245, 246, 247, 248, 249, 251, 250, 252, + 253, 254, 255, 256, 257, 258, 259, 182, -314, 102, + 41, 96, 182, -346, 102, -756, -288, -289, -294, -278, + 25, -346, -337, 182, 793, -459, -483, 521, 138, 519, + -133, 520, 87, 519, -133, 520, 279, -133, 87, -709, + -710, -711, -713, 279, 520, 519, 280, 350, -156, 182, + 323, 25, -490, -490, -483, 93, -740, -739, 41, 628, + -319, 32, 566, 746, 748, 544, 754, 763, 764, 765, + 92, -495, 146, 150, -495, -439, 26, -439, 32, 32, + 313, 313, 313, -495, 353, -769, -770, 25, 148, -493, + -770, -493, -493, -495, -771, 286, 554, 52, 314, 313, + -291, -292, 30, 96, -291, 548, 544, -598, 549, 550, + -497, -770, -496, -495, -495, -496, -495, -495, 394, -495, + 41, 389, 390, 284, 287, 584, 388, 768, 734, 772, + 287, -769, -769, 40, 40, 287, -315, -316, -346, -348, + -346, -549, 315, -576, -547, 45, 92, 183, 288, 183, + 92, 96, 465, 440, 502, 466, 584, 284, 479, 287, + 315, 480, 440, 502, 284, 287, 584, 315, 440, 284, + 287, 502, 315, 480, 440, 543, 544, 287, 36, 470, + 473, 474, 544, -661, 580, -346, 183, 127, 124, 126, + -510, 145, -525, 138, 139, 140, 141, 142, 143, 144, + 152, 151, 164, 157, 158, 159, 160, 161, 162, 163, + 153, 154, 155, 156, 148, 128, 167, 790, 146, 150, + 147, 130, 125, 170, 169, -258, -510, -518, 71, -508, + -508, -508, -508, -508, -483, -615, -515, -510, 96, 96, + 96, 96, 96, 182, 115, 102, 96, -510, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, -654, 96, 96, -522, -523, 96, 96, -503, -459, + 96, 102, 102, 96, 96, 96, 102, 96, 96, 96, + -523, -523, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - -749, -250, -282, 183, 96, -281, -282, -288, 29, -287, - -252, -251, -256, -260, -503, -752, 729, 41, 42, 41, - 42, 41, 42, 41, 42, 96, 112, 770, 265, -297, - -476, -298, -476, -184, 25, 787, -476, 739, -732, 389, - 628, 628, 389, 628, 274, 24, 377, 64, 378, 573, - 20, 195, 196, 197, -476, 194, 288, -476, -525, 290, - -525, -525, 745, 521, -525, -322, -476, 311, 464, 287, - 287, -225, -525, 25, -525, -525, -525, -525, 286, -525, - 284, 284, 284, -525, 591, 138, 138, 69, -640, -643, - -639, -642, 48, 132, -643, -302, 307, -271, -271, -339, - 183, -701, -293, 96, -711, 199, -274, -273, -268, -270, - -435, -437, -272, 96, -339, -251, 5, -476, 745, 521, - -627, -627, -339, -627, -476, 290, -543, -627, 619, -465, - -524, -476, -521, 220, 50, 169, -627, -627, -627, -418, - -419, -339, -712, 289, 765, -746, -745, 571, -748, 573, - 188, -563, 188, -563, 99, -542, 315, 315, 183, 138, - 32, -564, 138, 149, -563, -563, -564, -564, -387, 50, - -475, 179, -476, 102, -387, 50, -743, -742, -339, -282, - -252, -251, -256, -260, -286, -285, -287, -255, -252, -256, - -251, 71, 29, 97, 97, -282, -282, -436, -176, 628, - -627, -627, 745, 521, -627, -627, -627, -627, -627, 284, - -627, -627, -627, -483, -627, -324, 290, -627, 389, -627, - -627, -627, -261, -263, 159, -503, -476, -266, -10, -189, - -188, 132, 133, 135, 723, 459, 722, 726, 719, -563, - 50, -621, 173, 172, 96, -615, -617, 96, -616, 96, - -616, -616, -616, 218, 221, -615, -615, -616, -616, -616, - -616, -616, -616, 96, 96, -618, 96, -618, -618, -615, - -619, 212, 96, -619, -620, 96, -620, -619, -476, -595, - 20, -509, -511, -476, 288, 48, -282, -179, -287, 48, - -285, -288, -294, 307, 108, -331, 750, -476, 214, 193, - 738, 44, 182, 112, 102, -707, 233, 224, 138, -126, - 87, -149, 138, -126, -126, -149, 97, 183, -705, 118, - 119, -707, 102, -476, -147, 102, -670, -14, -20, -125, - -15, -151, -17, -19, -62, -102, 40, -153, -143, -239, - -245, -480, 298, 622, 624, -673, -671, -310, 183, 438, - 96, -311, 183, 546, 32, -476, -284, 633, -165, 32, - -488, 25, 148, -488, -488, 25, 148, -488, 315, -432, - -501, -501, -503, 440, 584, 284, -544, 597, 315, -475, - -762, -488, -488, -466, -465, -490, -485, -490, -490, -432, - -486, -488, -488, -503, 159, -490, -486, -432, -476, 544, - -432, -432, -591, -465, -488, 102, -487, -476, -487, -525, - -465, -466, -466, 41, 511, 92, 25, -570, 284, 584, - 464, 311, 287, 440, -568, -549, -546, -544, -542, -545, - -544, -573, -452, 544, -180, 527, 526, 365, 25, -503, - -503, -503, -503, 117, 128, 167, 414, 118, 119, -498, - -519, 41, 361, 362, -499, -499, -499, -499, -499, -499, - -499, -499, -499, -499, -499, -499, -501, -501, -507, -517, - -608, 96, 148, 146, 150, 147, 130, 148, 146, 150, - 147, 130, -768, 33, -501, -501, -499, -499, -501, -344, - -346, 172, 173, -389, -475, 179, 97, 183, -503, -698, - -697, 132, -503, -503, -503, -503, -533, -535, -452, 96, - -476, -499, -694, -695, 599, 600, 601, 602, 603, 604, - 605, 606, 607, 608, 609, 455, 450, 456, 454, 443, - 462, 457, 458, 216, 616, 617, 610, 611, 612, 613, - 614, 615, -509, -509, -503, -694, -499, -509, -445, 42, - 41, -511, -511, -511, 97, -503, -708, 412, 411, 413, - -453, -476, -509, 97, 97, 97, 112, -511, -511, -509, - -499, -509, -509, -509, -509, -695, -695, -696, 301, 213, - 215, 214, -445, -503, -503, -445, -445, -445, 159, -511, - -511, -445, -445, -445, -445, 159, -445, -445, -445, -445, - -445, -445, -445, -445, 97, -445, -445, -445, -445, -445, - 97, 97, 97, 97, -503, 97, -503, -503, -503, -503, - -503, 159, -511, -282, -749, -286, -178, -652, -651, -503, - 50, -179, -287, -285, -179, 680, -288, -753, 731, 96, - -452, -741, 102, 102, 787, -184, 25, 182, 284, -184, - 182, 739, 193, -184, 584, 25, -476, 102, 112, -476, - 102, 112, 284, 584, 284, 584, -339, -339, -339, 574, - 575, 192, 196, 195, -476, 194, -476, -476, 128, 167, - -476, -476, -525, -525, -476, 44, -324, -313, -476, -525, - -525, -716, -476, 103, 102, -550, -547, -544, -476, -476, - -540, -476, -465, -525, -525, -525, -339, -398, 63, 64, - 65, -544, -226, 66, 67, -245, -639, -641, -642, 134, - -339, -503, -641, -637, 71, -245, 96, 40, 96, -302, - -302, -700, 44, -292, -476, -712, 93, -438, -439, -440, - -441, -443, -444, -442, 78, 82, 84, 88, 79, 80, - 81, 547, 85, 90, 779, 83, -474, -479, 44, -476, - 102, -474, -251, -276, -275, -274, 787, -474, 96, 96, - -476, -476, -339, -339, -412, -420, -417, -413, 281, -421, - 307, 275, 448, 449, 277, 17, 276, -429, 354, -526, - 592, -393, -394, 87, 51, -396, 305, 488, 484, 785, - 317, 321, 106, 322, 521, 323, 286, 325, 326, 327, - 342, 344, 297, 328, 329, 330, 512, 331, 187, 343, - 332, 333, 334, 466, -388, 12, 396, 50, 61, 62, - 536, 535, 635, 20, 318, -476, 491, 624, 40, 45, - 277, 281, 276, -716, -714, 40, -476, -524, 40, -521, - 40, 220, 169, -472, 138, -550, -544, -476, -476, 183, - 288, -274, -276, -563, 183, 572, 574, 575, -746, -564, - -746, -564, 288, 41, 511, -567, 511, 41, -540, -561, - 568, 570, -556, 102, 512, -545, -566, 92, 179, -651, - -564, -564, -566, -566, 169, 183, -744, 573, 574, 271, - -286, -176, -280, -279, -503, -286, -286, -259, -252, -260, - -256, -251, 112, -734, -732, -476, 628, -476, -627, -627, - -341, -716, -549, -540, -476, -627, -341, -478, -478, -313, - 45, -476, -627, -476, -476, -476, -179, 183, -477, -476, - 44, 102, 182, -190, -188, 134, -503, -13, 722, -503, - -13, -13, -503, -13, -503, -625, 175, -346, 112, 112, - -455, 102, -455, 112, -619, 112, 112, 638, 97, 102, - 102, -286, -288, 706, -674, -670, -288, -179, -644, 71, - -245, 96, 40, 96, -627, 193, 214, 749, -330, 138, - 138, 138, 33, -476, 32, -126, -126, -707, 102, -149, - -707, 102, -126, -703, 182, -562, 519, 520, 183, -309, - -292, -339, 637, 112, -167, 30, -476, -432, -476, 745, - -432, -432, -476, 745, 747, -432, -543, -476, -476, -476, - -541, 93, -647, -476, 790, 100, -466, -432, -432, -490, - -432, -432, 183, 31, 97, -488, -490, -490, -330, -486, - -330, 182, -330, -465, -570, -548, -545, -572, 159, -476, - -557, 183, 20, 288, -729, -728, 503, 97, 183, -655, - 289, 591, 102, 787, 519, 265, 266, 102, 117, 414, - 118, 119, 117, 414, 118, 119, -608, -511, -507, -501, - -501, -499, -499, -507, -501, -501, -499, -499, 96, -505, - 302, -505, 127, -354, 178, 177, -354, -503, 788, -502, - -697, 134, -503, 44, 183, 44, 183, 93, 183, 97, - -615, -503, 182, 183, 97, 97, 25, 25, 148, 97, - -503, 97, 97, 97, 97, 25, 25, -503, 97, 182, - 97, 97, 97, 97, 93, 97, 183, 97, 97, 97, - 97, 183, 183, 183, -511, 97, 97, -511, -503, -511, - 97, 97, 97, -503, -503, -503, -511, 97, -503, -503, - -503, -503, -503, -503, -503, -503, 776, -503, -503, -511, - -503, -503, -580, 539, -580, -580, -580, 97, -580, 97, - 183, 97, 183, 97, 97, 183, 183, 183, -286, -282, - 183, 97, -288, -288, 20, -179, -754, 730, 96, 112, - 183, 771, -459, -458, 102, -186, 288, 193, 739, -476, - -476, -186, -476, -476, 138, -186, -476, 739, 102, 102, - -339, -465, -339, -465, 630, 48, 48, 193, 197, 197, - 196, -476, 102, 45, 45, 32, 32, 352, -476, -476, - -160, 625, -323, 96, 96, 182, -339, -339, -718, 489, - -476, -730, 183, 50, -728, 584, -222, 365, -529, -530, - 93, -235, 372, 25, -339, -339, -339, -353, 44, -245, - -640, 71, 96, 133, -245, -554, -553, 92, -645, -512, - -692, 705, -301, 97, -289, -476, -690, -691, -289, -295, - -303, -476, -637, -637, 96, 97, 183, 25, -267, -340, - -476, -274, -273, -273, -273, -273, -273, -273, -273, 78, - 89, 78, -290, 96, 78, 83, 78, 83, 78, 83, - 78, -440, 78, 78, 80, 89, -293, -479, 183, 97, - 99, -739, -738, -737, -735, 86, 289, 87, -503, -509, - 40, 40, 62, 61, -614, 44, -293, 183, 307, -338, - -473, -335, -337, 292, -493, -336, 295, 436, -686, 293, - 291, 122, 296, 350, 123, 286, 29, 417, -473, -415, - 286, 350, 293, -473, -473, 292, -397, 288, 44, 29, - 307, -414, 286, 123, -476, 292, 296, 293, 350, 291, - -472, -464, 169, 288, 52, 466, -472, 636, 307, -472, - -472, -472, -472, -472, -472, -472, -472, 324, 324, -472, - -472, -472, -472, -472, -472, -472, -472, -472, -472, -472, - 188, -472, -472, -472, -472, -472, -472, 96, 319, 320, - 352, 625, 132, 638, 627, -543, 288, 559, 559, -719, - 489, 40, 446, 446, 447, -472, 40, -472, -389, -730, - 442, 51, 40, -236, 440, -419, -416, -487, 40, 40, - -564, -745, -747, 576, 573, 579, -566, -566, 112, 288, - 96, 138, -566, -566, 50, -475, -742, 580, 574, -288, - 183, -277, 46, 47, 97, 97, -320, 741, -476, -476, - 92, -341, -630, 345, 346, 96, -324, 102, 25, -320, - -431, -430, 25, -263, -476, 102, -476, 159, 135, -13, - 133, -194, -193, -192, 136, 719, 726, 135, 135, 135, - 97, 97, 97, 97, 183, 97, 97, 97, 183, 97, - 183, 112, 767, -658, 549, -288, -179, 102, 183, -179, - -262, 774, -645, -301, 97, -690, -295, -476, 102, 112, - 102, 44, -234, 99, 107, 102, -331, -503, -476, 102, - -503, 214, 182, 521, -126, -126, -126, -126, -476, 138, - -671, 97, 112, -488, -476, -488, 182, -476, -231, -233, - -476, 102, -476, -540, -541, -475, -488, -432, -503, -503, - 553, 552, -432, -488, -488, -490, -476, -330, -572, 183, - 288, 182, 182, -546, 469, -548, 29, 20, -452, 48, - -459, 138, 787, -476, 97, -505, -505, 127, -505, -505, - 127, -501, -501, -498, 97, 135, -503, 133, -344, 217, - -503, -344, -345, -351, 233, 179, 217, 301, 216, 215, - 213, 172, 173, -387, -535, 630, -277, 97, -476, -511, - -503, -503, -499, 97, -503, -503, 25, -476, -387, -499, - -503, -503, -503, -282, -283, 776, -283, -282, 97, 97, - -579, -580, -579, -283, 97, 97, 97, 97, -579, 97, - 97, 97, 97, 97, 97, 97, 97, 27, 97, 97, - 97, 97, 183, -476, 96, -580, -766, 783, -503, -766, - -503, -766, -766, -503, 112, 114, 112, 114, -288, -286, - -651, -179, -179, 470, 96, 307, 183, 112, 102, 788, - 183, 138, 440, -185, -476, 102, -476, 25, 25, 182, - 102, -476, 102, 25, 284, -476, 25, 25, -339, -339, - -339, 197, 102, -731, 359, 440, 584, 284, 440, 359, - 584, 284, -596, 112, -363, 20, -367, 20, -161, 132, - 102, 477, -325, -326, -327, -328, -329, 148, 184, 185, - -314, -315, -316, -317, -346, -452, 775, 218, 221, 223, - 224, 225, 226, 227, 229, 230, 231, 232, 233, 236, - 237, 238, 239, 240, 241, 234, 235, 301, 213, 214, - 215, 216, 200, 219, 631, 201, 202, 203, 177, 178, - 204, 207, 208, 209, 210, 206, 242, 243, 244, 245, - 246, 247, 248, 249, 251, 250, 252, 253, 254, 255, - 256, 257, 258, 259, -476, -293, -293, -721, 551, 491, - 501, -472, 388, -495, -494, 442, 51, -632, 512, 497, - 498, -547, 315, -465, 159, -727, 109, 138, 92, 400, - 404, 406, 408, 407, 405, 401, 402, 403, -522, -523, - -520, -526, -465, 102, -714, 96, -246, -230, -229, 146, - -235, 372, 25, -245, 71, 289, 591, 96, -362, 327, - 96, -609, 385, -346, 96, -301, -640, -262, 49, 183, - 96, 97, 183, 71, 182, 183, 138, 97, 183, 97, - 183, 138, -262, -262, -553, -8, -476, -339, -267, -476, - 25, 183, -713, 182, 92, -305, -304, 92, 93, -305, - -305, -304, -304, 78, -291, 102, 78, 78, 78, 78, - 83, -275, -274, -737, -736, 32, -686, -686, -686, 183, - 97, -364, 96, -365, -232, -476, 102, -368, 96, -369, - -370, -476, 102, -609, -346, 44, -413, 281, 275, 276, - -600, 96, -343, 96, -452, -336, -685, -686, -685, -525, - -476, 123, -685, 123, 96, -576, 352, 353, -577, -598, - 355, -476, -452, -476, -476, -476, -343, -452, -452, -416, - -424, -423, -452, -427, 41, -428, -476, -476, -476, -476, - 123, -476, -476, 123, -392, 50, 58, 59, 60, -472, - -472, 220, -395, 50, 511, 513, 514, -427, 112, 112, - 112, 112, 112, 102, 102, 102, -472, -472, 112, 102, - -479, 102, -687, 196, 54, 55, 112, 112, 112, 112, - 50, 102, -400, 50, 335, 339, 336, 337, 338, 102, - 112, 50, 112, 50, 112, 50, -476, 96, -688, -689, - 102, -596, 102, 96, 112, 102, 277, -543, 102, 92, - -721, -472, 446, -563, 138, 138, -387, -472, -389, -495, - -723, 106, 492, -723, -726, 365, -238, 584, 41, -296, - 281, 276, -714, -552, -551, -452, -552, -566, 573, 577, - 578, -548, -491, 102, -556, -179, -279, -278, 53, -339, - -630, -314, -476, -432, -276, 182, 131, -13, -190, -192, - -503, -13, -503, 722, 459, 723, 102, 112, 112, 575, - -666, 533, 528, 530, -179, -667, 519, -670, -261, 97, - 71, 97, 33, 788, 788, 788, 788, 102, -476, 112, - 102, -432, -488, -432, -231, -488, -488, 148, -432, -330, - -432, -432, -488, 25, -545, -540, 159, 159, -476, 470, - -557, 102, 490, 102, 284, 788, 102, -459, -498, -498, - 97, -503, 97, -616, 44, 97, 97, -616, -616, -615, - -618, -615, -354, -354, 97, 96, -277, 97, 97, 32, - 97, 97, -579, 97, 97, -503, 182, 97, 97, 183, - 183, 97, -635, 593, -579, 27, -579, -636, 665, -579, - -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, - -579, -579, -579, -579, 96, -579, -579, -579, -579, -503, - -581, -585, -476, -580, 53, 97, 183, -580, 97, 183, - -580, -580, 97, 534, 736, 736, 534, 736, 736, -179, - -288, -511, -755, 73, 728, 72, 511, 117, 355, 97, - -694, 183, -467, 360, -467, -458, 102, -476, 102, 193, - 739, -476, 788, 788, 193, 739, -476, 102, -339, -465, - -299, 550, -242, 132, -243, 130, 52, 102, -476, 25, - -476, -476, 352, -476, 352, -476, -476, 102, 96, 96, - -166, 638, 96, -163, 626, 102, 97, 183, -452, 97, - 183, -346, 44, 44, -722, 106, -717, 102, -476, 103, - -476, -723, 181, 444, 50, 493, 494, 509, 439, 112, - 112, 499, -715, -476, -237, 284, 440, -237, -725, 62, - 138, 102, -339, -520, -464, 169, 326, -330, -476, 388, - -332, -333, -334, -343, -335, -337, -246, 44, -339, -339, - 102, -176, -332, -472, -332, -610, 387, 29, 112, 158, - -511, 97, 123, -512, -653, -652, 71, -245, -289, -645, - -476, -691, -651, -476, -476, -503, -262, 97, -294, 93, - 182, -276, -340, -476, 159, -503, -503, 96, -269, 780, - 97, 78, 788, 96, 78, 17, 27, 102, 183, -364, - 138, 183, -368, 138, -610, -245, -473, -601, -599, 307, - -422, 54, 56, -759, -343, -346, -683, -476, -683, -681, - -683, -476, -681, -681, -525, -503, -593, 356, 96, -591, - 96, -591, 123, 401, 404, 406, 408, 407, 436, 40, - 276, -425, 404, 398, 399, -558, 351, 128, 167, -558, - -422, -343, 288, 183, -277, 183, -476, -387, -387, 40, - 102, 102, -341, 97, 183, 138, 102, -163, -162, -503, - -247, -251, 288, 92, 284, -722, -717, 138, -564, 102, - 102, -387, -723, 102, 102, -727, 138, -342, 284, -465, - 183, -296, -296, -432, 25, 183, 138, -432, 97, -306, - 32, 51, 54, 55, 97, 388, -434, 27, 159, 135, - 133, 135, 135, -476, 97, 97, -622, 707, -662, -664, - 528, 29, 29, -306, -668, 712, 102, 71, -245, -645, - 214, 102, 788, -432, -488, -432, -432, 745, -432, -540, - -557, 512, -339, 183, 788, 220, -344, 220, -406, 102, - 103, -476, -503, 97, -476, -503, -503, 97, 102, 96, - 97, 102, -281, 97, 97, -514, -513, 307, -766, -503, - -766, -503, -767, 25, 97, 183, 97, 97, 97, 183, - 97, 97, -306, -179, 97, 183, 97, -694, -468, 214, - 102, -468, -185, -476, -185, -476, 25, -477, -240, 288, - -330, -244, 383, 96, 379, -242, 193, 96, 102, -476, - 25, -476, -596, 352, -596, 352, 284, -476, -320, -364, - -368, -164, 627, 112, -162, 102, -531, 632, -327, -346, - 282, -316, 50, -246, -246, 102, -720, 503, -597, 393, - 112, 50, 112, 181, 495, -633, -223, 106, -341, 41, - -296, -223, -724, 106, 138, 787, 96, -472, -472, -472, - -240, 388, -476, 97, 183, -246, -241, 60, -476, -282, - 97, 744, 97, -611, 306, 112, 158, 112, 158, 112, - 97, 71, 23, 289, 97, -645, 182, 138, -474, -276, - -476, -432, -713, 182, -113, -114, 132, -292, -500, 181, - -682, -476, 291, 29, 29, 550, -365, 97, -233, -369, - 97, -371, -476, 102, -611, 96, 97, 183, -476, -452, - 97, 183, -359, -358, -356, 117, 128, 167, 50, 484, - -357, 106, 752, 753, 169, 340, 343, 342, 318, 341, - -411, -492, 92, 700, 487, 398, 399, -526, 715, 44, - 291, 122, 123, 471, -493, 96, 96, 96, 93, 360, - 96, 96, -683, 97, -578, 357, 112, -499, 96, -499, - 96, -592, 354, 96, -536, -536, -536, -536, -536, 50, - -425, 50, -426, 423, 351, 351, -422, -452, -423, -476, - 169, -387, 97, -689, 102, 97, -543, 284, -476, -720, - 102, -566, -725, 102, -223, -341, -714, -282, -276, -551, - -651, -262, 23, 74, 148, -476, -433, 28, 29, 290, - -13, 723, 459, -402, 708, 102, 29, 102, -660, 102, - -658, 102, -645, 102, -432, -476, -182, -399, -464, 323, - 40, 97, 40, -405, 148, 20, 97, 97, 97, -283, - -281, -579, 97, -579, -282, 29, -580, 97, -580, 97, - -766, 54, 102, 102, -306, -503, 97, 102, 102, 102, - 739, 440, -240, 44, 477, 30, 644, 384, -292, 380, - 381, 382, -476, 102, -511, -247, 787, 388, -476, 25, - 102, -596, 102, -596, -476, 352, 97, 97, 44, 102, - 97, 102, 102, -318, -346, -496, -227, 20, -227, 29, - 20, 181, 443, 50, 112, 50, 496, 102, -237, 138, - 118, 119, -460, -461, 102, -533, -387, -389, 102, -476, - -360, -246, -230, -229, -361, -429, -526, -334, -240, 36, - 388, -286, -181, -362, -366, -372, -378, -379, -180, 327, - -363, -360, -612, 187, 112, 158, 112, 112, 96, -552, - -476, -503, -432, -432, -262, 774, -114, -116, 128, 167, - -476, 97, 97, 183, 96, -612, -759, -599, -602, 71, - -343, -356, 117, 117, -499, 102, 102, 102, -389, -390, - 50, 339, 335, 138, 138, -391, 50, 319, 320, -401, - 96, 350, 23, 112, 220, 716, 96, 123, 123, -339, - -533, -533, -533, -684, 400, 401, 402, 410, 404, 405, - 403, 406, 407, 408, 409, -684, -533, -533, 96, -559, - -558, -600, 29, 97, -573, 97, -573, 96, 138, -499, - -537, 297, 415, 416, 106, 20, 398, 399, 420, 419, - 418, 424, 425, 429, 430, 426, 428, 427, 431, 435, - 432, 433, 434, 437, 421, 422, 64, 423, 443, 454, - 450, -499, -536, 138, -472, 169, -476, 182, -724, -284, - -432, 74, -583, 781, -503, -511, 758, 760, 761, -476, - -476, -456, 709, 112, 102, 530, -666, -488, -623, 710, - -656, -591, -387, 138, -387, -387, 97, 85, 631, 409, - 633, -579, 97, -579, -587, -586, -590, 534, 352, 542, - -511, -766, -766, -580, 97, 97, 97, -476, -476, -339, - 102, 112, 97, 127, 127, 97, 97, -463, -462, 102, - -476, 388, -476, -320, 102, -320, 102, 352, -596, -9, - 632, -228, 70, 580, 102, 103, 490, 102, 103, 112, - 443, -223, 102, 788, 183, 138, 97, -597, -574, 307, - -246, 44, 183, -429, -464, -476, -182, -472, -574, -629, - 196, 386, 20, 112, 158, 112, -511, -282, -262, -261, - -115, 127, -116, -116, -476, 291, -3, -1, -476, 7, - -613, 196, 386, 97, -607, -603, 96, -604, -429, 309, - 148, 102, 102, 112, 96, -646, 40, 44, -503, -534, - 96, 97, 97, 97, 97, 97, -533, -577, 97, 97, - 97, -573, 112, 97, -472, -472, 102, 102, 397, -472, - -472, -472, -472, -472, -472, 96, 102, 102, -472, -472, - -472, -472, -472, -472, 138, 138, -472, -472, -472, 118, - 119, -387, -472, 182, -476, -262, -262, 75, -584, -582, - -476, -631, 20, 759, 96, 96, 96, 29, -622, -432, - -624, 711, 102, -665, 533, -659, -657, 528, 529, 530, - 531, 102, 97, 632, 75, 75, 634, -589, 130, 495, - 499, -497, 103, -500, 112, 114, 211, -580, -580, 102, - -476, 102, 788, 183, 138, -476, 388, -320, -320, -596, - 102, -321, -476, 350, 512, -461, 102, -538, -575, 359, - 29, -246, -429, -472, -597, 751, 755, -386, 757, 756, - 68, -575, 386, 112, 158, 112, 97, -284, 133, -503, - -115, -115, 97, 183, 32, -346, -7, 6, 386, -607, - -604, -606, -605, 357, 310, 96, 97, -503, -515, -472, - 96, 97, -404, -403, 629, -533, -536, 93, -536, -536, - 93, -536, 93, -536, 93, 97, -594, 358, 97, 112, - 112, -476, 112, 112, 112, 112, 112, 112, -573, 112, + 96, 96, -756, -257, -289, 183, 96, -288, -289, -295, + 29, -294, -259, -258, -263, -267, -510, -759, 729, 41, + 42, 41, 42, 41, 42, 41, 42, 96, 112, 776, + 265, -304, -483, -305, -483, -191, 25, 793, -483, 739, + -739, 389, 628, 628, 389, 628, 274, 24, 377, 64, + 378, 573, 20, 195, 196, 197, -483, 194, 288, -483, + -532, 290, -532, -532, 745, 521, -532, -329, -483, 311, + 464, 287, 287, 287, -232, -532, 25, -532, -532, -532, + -532, 286, -532, 284, 284, 284, -532, 591, 138, 138, + 69, -647, -650, -646, -649, 48, 132, -650, -309, 307, + -278, -278, -346, 183, -708, -300, 96, -718, 199, -281, + -280, -275, -277, -442, -444, -279, 96, -346, -258, 5, + -483, 745, 521, -634, -634, -346, -634, -483, 290, -550, + -634, 619, -472, -531, -483, -528, 220, 50, 169, -634, + 287, -634, -634, -425, -426, -346, -719, 289, 765, -753, + -752, 571, -755, 573, 188, -570, 188, -570, 99, -549, + 315, 315, 183, 138, 32, -571, 138, 149, -570, -570, + -571, -571, -394, 50, -482, 179, -483, 102, -394, 50, + -750, -749, -346, -289, -259, -258, -263, -267, -293, -292, + -294, -262, -259, -263, -258, 71, 29, 97, 97, -289, + -289, -443, -183, 628, -634, -634, 745, 521, -634, -634, + -634, -634, -634, 284, -634, -634, -634, -490, -634, -331, + 290, 287, -634, 389, -634, -634, -634, -268, -270, 159, + -510, -483, -273, -10, -196, -195, 132, 133, 135, 723, + 459, 722, 726, 719, -570, 50, -628, 173, 172, 96, + -622, -624, 96, -623, 96, -623, -623, -623, 218, 221, + -622, -622, -623, -623, -623, -623, -623, -623, 96, 96, + -625, 96, -625, -625, -622, -626, 212, 96, -626, -627, + 96, -627, -626, -483, -602, 20, -516, -518, -483, 288, + 48, -289, -186, -294, 48, -292, -295, -301, 307, 108, + -338, 750, -483, 214, 193, 738, 44, 182, 112, 102, + -714, 233, 224, 138, -133, 87, -156, 138, -133, -133, + -156, 97, 183, -712, 118, 119, -714, 102, -483, -154, + 102, -677, -14, -20, -132, -15, -158, -17, -19, -69, + -109, 40, -160, -150, -246, -252, -487, 298, 622, 624, + -680, -678, -483, -291, 633, -172, 32, -495, 25, 148, + -495, -495, 25, 148, -495, 315, -439, -508, -508, -510, + 440, 584, 284, -551, 597, 315, -482, -769, -495, -495, + -473, -472, -497, -492, -497, -497, -439, -493, -495, -495, + -510, 159, -497, -493, -439, -483, 544, -439, -439, -598, + -472, -495, 102, -494, -483, -494, -532, -472, 287, 773, + -473, -473, -346, -317, 183, 438, 96, -318, 183, 546, + 32, 41, 511, 92, 25, -577, 284, 584, 464, 311, + 287, 440, -575, -556, -553, -551, -549, -552, -551, -580, + -459, 544, -187, 527, 526, 365, 25, -510, -510, -510, + -510, 117, 128, 167, 414, 118, 119, -505, -526, 41, + 361, 362, -506, -506, -506, -506, -506, -506, -506, -506, + -506, -506, -506, -506, -508, -508, -514, -524, -615, 96, + 148, 146, 150, 147, 130, 148, 146, 150, 147, 130, + -775, 33, -508, -508, -506, -506, -508, -351, -353, 172, + 173, -396, -482, 179, 97, 183, -510, -705, -704, 132, + -510, -510, -510, -510, -540, -542, -459, 96, -483, -506, + -701, -702, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 455, 450, 456, 454, 443, 462, 457, + 458, 216, 616, 617, 610, 611, 612, 613, 614, 615, + -516, -516, -510, -701, -506, -516, -452, 42, 41, -518, + -518, -518, 97, -510, -715, 412, 411, 413, -460, -483, + -516, 97, 97, 97, 112, -518, -518, -516, -506, -516, + -516, -516, -516, -702, -702, -703, 301, 213, 215, 214, + -452, -510, -510, -452, -452, -452, 159, -518, -518, -452, + -452, -452, -452, 159, -452, -452, -452, -452, -452, -452, + -452, -452, 97, -452, -452, -452, -452, -452, 97, 97, + 97, 97, -510, 97, -510, -510, -510, -510, -510, 159, + -518, -289, -756, -293, -185, -659, -658, -510, 50, -186, + -294, -292, -186, 680, -295, -760, 731, 96, -459, -748, + 102, 102, 793, -191, 25, 182, 284, -191, 182, 739, + 193, -191, 584, 25, -483, 102, 112, -483, 102, 112, + 284, 584, 284, 584, -346, -346, -346, 574, 575, 192, + 196, 195, -483, 194, -483, -483, 128, 167, -483, -483, + -532, -532, -483, 44, -331, -320, -483, -532, -532, -532, + -723, -483, 103, 102, -557, -554, -551, -483, -483, -547, + -483, -472, -532, -532, -532, -346, -405, 63, 64, 65, + -551, -233, 66, 67, -252, -646, -648, -649, 134, -346, + -510, -648, -644, 71, -252, 96, 40, 96, -309, -309, + -707, 44, -299, -483, -719, 93, -445, -446, -447, -448, + -450, -451, -449, 78, 82, 84, 88, 79, 80, 81, + 547, 85, 90, 785, 83, -481, -486, 44, -483, 102, + -481, -258, -283, -282, -281, 793, -481, 96, 96, -483, + -483, -346, -346, -419, -427, -424, -420, 281, -428, 307, + 275, 448, 449, 277, 17, 276, -436, 354, -533, 592, + -400, -401, 87, 51, -403, 305, 488, 484, 791, 317, + 321, 106, 322, 521, 323, 286, 325, 326, 327, 342, + 344, 297, 328, 329, 330, 512, 331, 187, 343, 332, + 333, 334, 466, -395, 12, 396, 50, 61, 62, 536, + 535, 635, 20, 318, -483, 491, 624, 40, 45, 277, + 281, 276, -723, -721, 40, -483, -531, 40, -528, 40, + 220, 169, -479, 138, -557, -551, -346, -483, -483, 183, + 288, -281, -283, -570, 183, 572, 574, 575, -753, -571, + -753, -571, 288, 41, 511, -574, 511, 41, -547, -568, + 568, 570, -563, 102, 512, -552, -573, 92, 179, -658, + -571, -571, -573, -573, 169, 183, -751, 573, 574, 271, + -293, -183, -287, -286, -510, -293, -293, -266, -259, -267, + -263, -258, 112, -741, -739, -483, 628, -483, -634, -634, + -348, -723, -556, -547, -483, -634, -348, -485, -485, -320, + 45, -634, -483, -634, -483, -483, -483, -186, 183, -484, + -483, 44, 102, 182, -197, -195, 134, -510, -13, 722, + -510, -13, -13, -510, -13, -510, -632, 175, -353, 112, + 112, -462, 102, -462, 112, -626, 112, 112, 638, 97, + 102, 102, -293, -295, 706, -681, -677, -295, -186, -651, + 71, -252, 96, 40, 96, -634, 193, 214, 749, -337, + 138, 138, 138, 33, -483, 32, -133, -133, -714, 102, + -156, -714, 102, -133, -710, 182, -569, 519, 520, 274, + 183, 112, -174, 30, -483, -439, -483, 745, -439, -439, + -483, 745, 747, -439, -550, -483, -483, -483, -548, 93, + -654, -483, 796, 100, -473, -439, -439, -497, -439, -439, + 183, 31, 97, -495, -497, -497, -337, -493, -337, 182, + -337, -472, -346, -346, -316, -299, -346, 637, -577, -555, + -552, -579, 159, -483, -564, 183, 20, 288, -736, -735, + 503, 97, 183, -662, 289, 591, 102, 793, 519, 265, + 266, 102, 117, 414, 118, 119, 117, 414, 118, 119, + -615, -518, -514, -508, -508, -506, -506, -514, -508, -508, + -506, -506, 96, -512, 302, -512, 127, -361, 178, 177, + -361, -510, 794, -509, -704, 134, -510, 44, 183, 44, + 183, 93, 183, 97, -622, -510, 182, 183, 97, 97, + 25, 25, 148, 97, -510, 97, 97, 97, 97, 25, + 25, -510, 97, 182, 97, 97, 97, 97, 93, 97, + 183, 97, 97, 97, 97, 183, 183, 183, -518, 97, + 97, -518, -510, -518, 97, 97, 97, -510, -510, -510, + -518, 97, -510, -510, -510, -510, -510, -510, -510, -510, + 782, -510, -510, -518, -510, -510, -587, 539, -587, -587, + -587, 97, -587, 97, 183, 97, 183, 97, 97, 183, + 183, 183, -293, -289, 183, 97, -295, -295, 20, -186, + -761, 730, 96, 112, 183, 777, -466, -465, 102, -193, + 288, 193, 739, -483, -483, -193, -483, -483, 138, -193, + -483, 739, 102, 102, -346, -472, -346, -472, 630, 48, + 48, 193, 197, 197, 196, -483, 102, 45, 45, 32, + 32, 352, -483, -483, -167, 625, -330, 96, 96, 182, + -346, -346, -346, -725, 489, -483, -737, 183, 50, -735, + 584, -229, 365, -536, -537, 93, -242, 372, 25, -346, + -346, -346, -360, 44, -252, -647, 71, 96, 133, -252, + -561, -560, 92, -652, -519, -699, 705, -308, 97, -296, + -483, -697, -698, -296, -302, -310, -483, -644, -644, 96, + 97, 183, 25, -274, -347, -483, -281, -280, -280, -280, + -280, -280, -280, -280, 78, 89, 78, -297, 96, 78, + 83, 78, 83, 78, 83, 78, -447, 78, 78, 80, + 89, -300, -486, 183, 97, 99, -746, -745, -744, -742, + 86, 289, 87, -510, -516, 40, 40, 62, 61, -621, + 44, -300, 183, 307, -345, -480, -342, -344, 292, -500, + -343, 295, 436, -693, 293, 291, 122, 296, 350, 123, + 286, 29, 417, -480, -422, 286, 350, 293, -480, -480, + 292, -404, 288, 44, 29, 307, -421, 286, 123, -483, + 292, 296, 293, 350, 291, -479, -471, 169, 288, 52, + 466, -479, 636, 307, -479, -479, -479, -479, -479, -479, + -479, -479, 324, 324, -479, -479, -479, -479, -479, -479, + -479, -479, -479, -479, -479, 188, -479, -479, -479, -479, + -479, -479, 96, 319, 320, 352, 625, 132, 638, 627, + -550, 288, 559, 559, -726, 489, 40, 446, 446, 447, + -479, 40, -479, -396, -737, 442, 51, -67, 769, 40, + -243, 440, -426, -423, -494, 40, 40, -571, -752, -754, + 576, 573, 579, -573, -573, 112, 288, 96, 138, -573, + -573, 50, -482, -749, 580, 574, -295, 183, -284, 46, + 47, 97, 97, -327, 741, -483, -483, 92, -348, -637, + 345, 346, 96, -331, -346, 102, 25, -327, -438, -437, + 25, -270, -483, 102, -483, 159, 135, -13, 133, -201, + -200, -199, 136, 719, 726, 135, 135, 135, 97, 97, + 97, 97, 183, 97, 97, 97, 183, 97, 183, 112, + 767, -665, 549, -295, -186, 102, 183, -186, -269, 780, + -652, -308, 97, -697, -302, -483, 102, 112, 102, 44, + -241, 99, 107, 102, -338, -510, -483, 102, -510, 214, + 182, 521, -133, -133, -133, -133, -483, 138, -678, 112, + -495, -483, -495, 182, -483, -238, -240, -483, 102, -483, + -547, -548, -482, -495, -439, -510, -510, 553, 552, -439, + -495, -495, -497, -483, -337, 97, -579, 183, 288, 182, + 182, -553, 469, -555, 29, 20, -459, 48, -466, 138, + 793, -483, 97, -512, -512, 127, -512, -512, 127, -508, + -508, -505, 97, 135, -510, 133, -351, 217, -510, -351, + -352, -358, 233, 179, 217, 301, 216, 215, 213, 172, + 173, -394, -542, 630, -284, 97, -483, -518, -510, -510, + -506, 97, -510, -510, 25, -483, -394, -506, -510, -510, + -510, -289, -290, 782, -290, -289, 97, 97, -586, -587, + -586, -290, 97, 97, 97, 97, -586, 97, 97, 97, + 97, 97, 97, 97, 97, 27, 97, 97, 97, 97, + 183, -483, 96, -587, -773, 789, -510, -773, -510, -773, + -773, -510, 112, 114, 112, 114, -295, -293, -658, -186, + -186, 470, 96, 307, 183, 112, 102, 794, 183, 138, + 440, -192, -483, 102, -483, 25, 25, 182, 102, -483, + 102, 25, 284, -483, 25, 25, -346, -346, -346, 197, + 102, -738, 359, 440, 584, 284, 440, 359, 584, 284, + -603, 112, -370, 20, -374, 20, -168, 132, 102, 477, + -332, -333, -334, -335, -336, 148, 184, 185, -321, -322, + -323, -324, -353, -459, 781, 218, 221, 223, 224, 225, + 226, 227, 229, 230, 231, 232, 233, 236, 237, 238, + 239, 240, 241, 234, 235, 301, 213, 214, 215, 216, + 200, 219, 631, 201, 202, 203, 177, 178, 204, 207, + 208, 209, 210, 206, 242, 243, 244, 245, 246, 247, + 248, 249, 251, 250, 252, 253, 254, 255, 256, 257, + 258, 259, -483, -300, -67, -300, -728, 551, 491, 501, + -479, 388, -502, -501, 442, 51, -639, 512, 497, 498, + -554, 315, -472, 159, -734, 109, 138, 92, 400, 404, + 406, 408, 407, 405, 401, 402, 403, -529, -530, -527, + -533, -472, 102, -721, 96, -253, -237, -236, 146, -242, + 372, 25, -252, 71, 289, 591, 96, -369, 327, 96, + -616, 385, -353, 96, -308, -647, -269, 49, 183, 96, + 97, 183, 71, 182, 183, 138, 97, 183, 97, 183, + 138, -269, -269, -560, -8, -483, -346, -274, -483, 25, + 183, -720, 182, 92, -312, -311, 92, 93, -312, -312, + -311, -311, 78, -298, 102, 78, 78, 78, 78, 83, + -282, -281, -744, -743, 32, -693, -693, -693, 183, 97, + -371, 96, -372, -239, -483, 102, -375, 96, -376, -377, + -483, 102, -616, -353, 44, -420, 281, 275, 276, -607, + 96, -350, 96, -459, -343, -692, -693, -692, -532, -483, + 123, -692, 123, 96, -583, 352, 353, -584, -605, 355, + -483, -459, -483, -483, -483, -350, -459, -459, -423, -431, + -430, -459, -434, 41, -435, -483, -483, -483, -483, 123, + -483, -483, 123, -399, 50, 58, 59, 60, -479, -479, + 220, -402, 50, 511, 513, 514, -434, 112, 112, 112, + 112, 112, 102, 102, 102, -479, -479, 112, 102, -486, + 102, -694, 196, 54, 55, 112, 112, 112, 112, 50, + 102, -407, 50, 335, 339, 336, 337, 338, 102, 112, + 50, 112, 50, 112, 50, -483, 96, -695, -696, 102, + -603, 102, 96, 112, 102, 277, -550, 102, 92, -728, + -479, 446, -570, 138, 138, -394, -479, -396, -502, -730, + 106, 492, -730, 770, 771, -733, 365, -245, 584, 41, + -303, 281, 276, -721, -559, -558, -459, -559, -573, 573, + 577, 578, -555, -498, 102, -563, -186, -286, -285, 53, + -346, -637, -321, -483, -439, -283, 182, 131, -13, -197, + -199, -510, -13, -510, 722, 459, 723, 102, 112, 112, + 575, -673, 533, 528, 530, -186, -674, 519, -677, -268, + 97, 71, 97, 33, 794, 794, 794, 794, 102, -483, + 112, 102, -439, -495, -439, -238, -495, -495, 148, -439, + -337, -439, -439, -495, 25, -552, -547, 159, 159, -483, + 470, -564, 102, 490, 102, 284, 794, 102, -466, -505, + -505, 97, -510, 97, -623, 44, 97, 97, -623, -623, + -622, -625, -622, -361, -361, 97, 96, -284, 97, 97, + 32, 97, 97, -586, 97, 97, -510, 182, 97, 97, + 183, 183, 97, -642, 593, -586, 27, -586, -643, 665, + -586, -586, -586, -586, -586, -586, -586, -586, -586, -586, + -586, -586, -586, -586, -586, 96, -586, -586, -586, -586, + -510, -588, -592, -483, -587, 53, 97, 183, -587, 97, + 183, -587, -587, 97, 534, 736, 736, 534, 736, 736, + -186, -295, -518, -762, 73, 728, 72, 511, 117, 355, + 97, -701, 183, -474, 360, -474, -465, 102, -483, 102, + 193, 739, -483, 794, 794, 193, 739, -483, 102, -346, + -472, -306, 550, -249, 132, -250, 130, 52, 102, -483, + 25, -483, -483, 352, -483, 352, -483, -483, 102, 96, + 96, -173, 638, 96, -170, 626, 102, 97, 183, -459, + 97, 183, -353, 44, 44, 44, -729, 106, -724, 102, + -483, 103, -483, -730, 181, 444, 50, 493, 494, 509, + 439, 112, 112, 499, -722, -483, -244, 284, 440, -244, + -732, 62, 138, 102, -346, -527, -471, 169, 326, -337, + -483, 388, -339, -340, -341, -350, -342, -344, -253, 44, + -346, -346, 102, -183, -339, -479, -339, -617, 387, 29, + 112, 158, -518, 97, 123, -519, -660, -659, 71, -252, + -296, -652, -483, -698, -658, -483, -483, -510, -269, 97, + -301, 93, 182, -283, -347, -483, 159, -510, -510, 96, + -276, 786, 97, 78, 794, 96, 78, 17, 27, 102, + 183, -371, 138, 183, -375, 138, -617, -252, -480, -608, + -606, 307, -429, 54, 56, -766, -350, -353, -690, -483, + -690, -688, -690, -483, -688, -688, -532, -510, -600, 356, + 96, -598, 96, -598, 123, 401, 404, 406, 408, 407, + 436, 40, 276, -432, 404, 398, 399, -565, 351, 128, + 167, -565, -429, -350, 288, 183, -284, 183, -483, -394, + -394, 40, 102, 102, -348, 97, 183, 138, 102, -170, + -169, -510, -254, -258, 288, 92, 284, -729, -724, 138, + -571, 102, 102, -394, -730, 102, 102, 181, -734, 138, + -349, 284, -472, 183, -303, -303, -439, 25, 183, 138, + -439, 97, -313, 32, 51, 54, 55, 97, 388, -441, + 27, 159, 135, 133, 135, 135, -483, 97, 97, -629, + 707, -669, -671, 528, 29, 29, -313, -675, 712, 102, + 71, -252, -652, 214, 102, 794, -439, -495, -439, -439, + 745, -439, -547, -564, 512, -346, 183, 794, 220, -351, + 220, -413, 102, 103, -483, -510, 97, -483, -510, -510, + 97, 102, 96, 97, 102, -288, 97, 97, -521, -520, + 307, -773, -510, -773, -510, -774, 25, 97, 183, 97, + 97, 97, 183, 97, 97, -313, -186, 97, 183, 97, + -701, -475, 214, 102, -475, -192, -483, -192, -483, 25, + -484, -247, 288, -337, -251, 383, 96, 379, -249, 193, + 96, 102, -483, 25, -483, -603, 352, -603, 352, 284, + -483, -327, -371, -375, -171, 627, 112, -169, 102, -538, + 632, -334, -353, 282, -323, 50, -253, -253, -253, 102, + -727, 503, -604, 393, 112, 50, 112, 181, 495, -640, + -230, 106, -348, 41, -303, -230, -731, 106, 138, 793, + 96, -479, -479, -479, -247, 388, -483, 97, 183, -253, + -248, 60, -483, -289, 97, 744, 97, -618, 306, 112, + 158, 112, 158, 112, 97, 71, 23, 289, 97, -652, + 182, 138, -481, -283, -483, -439, -720, 182, -120, -121, + 132, -299, -507, 181, -689, -483, 291, 29, 29, 550, + -372, 97, -240, -376, 97, -378, -483, 102, -618, 96, + 97, 183, -483, -459, 97, 183, -366, -365, -363, 117, + 128, 167, 50, 484, -364, 106, 752, 753, 169, 340, + 343, 342, 318, 341, -418, -499, 92, 700, 487, 398, + 399, -533, 715, 44, 291, 122, 123, 471, -500, 96, + 96, 96, 93, 360, 96, 96, -690, 97, -585, 357, + 112, -506, 96, -506, 96, -599, 354, 96, -543, -543, + -543, -543, -543, 50, -432, 50, -433, 423, 351, 351, + -429, -459, -430, -483, 169, -394, 97, -696, 102, 97, + -550, 284, -483, -727, 102, -573, 112, -732, 102, -230, + -348, -721, -289, -283, -558, -658, -269, 23, 74, 148, + -483, -440, 28, 29, 290, -13, 723, 459, -409, 708, + 102, 29, 102, -667, 102, -665, 102, -652, 102, -439, + -483, -189, -406, -471, 323, 40, 97, 40, -412, 148, + 20, 97, 97, 97, -290, -288, -586, 97, -586, -289, + 29, -587, 97, -587, 97, -773, 54, 102, 102, -313, + -510, 97, 102, 102, 102, 739, 440, -247, 44, 477, + 30, 644, 384, -299, 380, 381, 382, -483, 102, -518, + -254, 793, 388, -483, 25, 102, -603, 102, -603, -483, + 352, 97, 97, 44, 102, 97, 102, 102, -325, -353, + -503, -234, 20, -234, 29, 20, 181, 443, 50, 112, + 50, 496, 102, -244, 138, 118, 119, -467, -468, 102, + -540, -394, -396, 102, -483, -367, -253, -237, -236, -368, + -436, -533, -341, -247, 36, 388, -293, -188, -369, -373, + -379, -385, -386, -187, 327, -370, -367, -619, 187, 112, + 158, 112, 112, 96, -559, -483, -510, -439, -439, -269, + 780, -121, -123, 128, 167, -483, 97, 97, 183, 96, + -619, -766, -606, -609, 71, -350, -363, 117, 117, -506, + 102, 102, 102, -396, -397, 50, 339, 335, 138, 138, + -398, 50, 319, 320, -408, 96, 350, 23, 112, 220, + 716, 96, 123, 123, -346, -540, -540, -540, -691, 400, + 401, 402, 410, 404, 405, 403, 406, 407, 408, 409, + -691, -540, -540, 96, -566, -565, -607, 29, 97, -580, + 97, -580, 96, 138, -506, -544, 297, 415, 416, 106, + 20, 398, 399, 420, 419, 418, 424, 425, 429, 430, + 426, 428, 427, 431, 435, 432, 433, 434, 437, 421, + 422, 64, 423, 443, 454, 450, -506, -543, 138, -479, + 169, -483, 182, -68, 450, 456, 454, 443, -731, -291, + -439, 74, -590, 787, -510, -518, 758, 760, 761, -483, + -483, -463, 709, 112, 102, 530, -673, -495, -630, 710, + -663, -598, -394, 138, -394, -394, 97, 85, 631, 409, + 633, -586, 97, -586, -594, -593, -597, 534, 352, 542, + -518, -773, -773, -587, 97, 97, 97, -483, -483, -346, + 102, 112, 97, 127, 127, 97, 97, -470, -469, 102, + -483, 388, -483, -327, 102, -327, 102, 352, -603, -9, + 632, -235, 70, 580, 102, 103, 490, 102, 103, 112, + 443, -230, 102, 794, 183, 138, 97, -604, -581, 307, + -253, 44, 183, -436, -471, -483, -189, -479, -581, -636, + 196, 386, 20, 112, 158, 112, -518, -289, -269, -268, + -122, 127, -123, -123, -483, 291, -3, -1, -483, 7, + -620, 196, 386, 97, -614, -610, 96, -611, -436, 309, + 148, 102, 102, 112, 96, -653, 40, 44, -510, -541, + 96, 97, 97, 97, 97, 97, -540, -584, 97, 97, + 97, -580, 112, 97, -479, -479, 102, 102, 397, -479, + -479, -479, -479, -479, -479, 96, 102, 102, -479, -479, + -479, -479, -479, -479, 138, 138, -479, -479, -479, 118, + 119, -394, -479, 182, -483, -269, -269, 75, -591, -589, + -483, -638, 20, 759, 96, 96, 96, 29, -629, -439, + -631, 711, 102, -672, 533, -666, -664, 528, 529, 530, + 531, 102, 97, 632, 75, 75, 634, -596, 130, 495, + 499, -504, 103, -507, 112, 114, 211, -587, -587, 102, + -483, 102, 794, 183, 138, -483, 388, -327, -327, -603, + 102, -328, -483, 350, 512, -468, 102, -545, -582, 359, + 29, -253, -436, -479, -604, 751, 755, -393, 757, 756, + 68, -582, 386, 112, 158, 112, 97, -291, 133, -510, + -122, -122, 97, 183, 32, -353, -7, 6, 386, -614, + -611, -613, -612, 357, 310, 96, 97, -510, -522, -479, + 96, 97, -411, -410, 629, -540, -543, 93, -543, -543, + 93, -543, 93, -543, 93, 97, -601, 358, 97, 112, + 112, -483, 112, 112, 112, 112, 112, 112, -580, 112, 112, 112, 112, 112, 112, 118, 119, 118, 119, 112, - 112, 112, -387, -476, 183, 44, 761, 96, -511, -511, - -457, -476, -660, -402, 102, -669, 289, -663, -664, 532, - -657, 29, 530, 29, 29, -183, 183, 75, -588, -589, - 499, -497, 103, -500, 705, 540, 540, 540, 540, -242, - -243, -242, -243, -320, -462, 102, -476, 102, -320, -319, - 44, 535, 470, -539, -537, -530, 29, -576, -387, -367, - -373, 20, -383, 20, -380, 20, 112, -262, 23, 24, + 112, 112, -394, -483, 183, 44, 761, 96, -518, -518, + -464, -483, -667, -409, 102, -676, 289, -670, -671, 532, + -664, 29, 530, 29, 29, -190, 183, 75, -595, -596, + 499, -504, 103, -507, 705, 540, 540, 540, 540, -249, + -250, -249, -250, -327, -469, 102, -483, 102, -327, -326, + 44, 535, 470, -546, -544, -537, 29, -583, -394, -374, + -380, 20, -390, 20, -387, 20, 112, -269, 23, 24, 133, 133, 97, -1, 8, 6, 45, 102, 97, 183, - -476, 306, 96, -510, -504, -503, 306, 97, -387, -503, - -560, 718, 717, -410, -408, -409, 92, 547, 348, 349, - 97, -684, -684, -684, -684, -411, 112, 97, -582, 96, - -177, 96, 97, 97, 97, 183, -456, -677, 96, 112, - -662, -661, -663, 29, -660, 29, -660, -660, 537, 20, - 127, 541, 541, 541, 541, -242, -242, -320, 102, -452, - 96, -593, 96, 96, 96, 40, 22, 22, 102, 6, - 550, -605, -603, -510, 97, 183, -558, 97, -409, 92, - -408, 92, 24, 23, -536, -536, -536, -536, -581, 97, - 183, -509, -476, -680, 40, 97, -676, -675, -453, -670, - 533, 534, 102, -660, 138, 633, -588, -758, -757, 735, - -573, -578, -374, -375, -376, -476, 102, -384, -385, -376, - -381, -382, -376, -552, 96, 71, 96, 71, -2, -4, - 117, 10, 50, 102, 96, 97, -504, -560, -407, 345, - 346, 40, 196, -407, 97, 96, 97, -679, -678, -454, - 97, 183, 102, 634, 102, 97, -600, 97, 183, 138, - 97, 183, 138, 97, 183, 138, -300, -476, 96, -300, - 96, 92, 102, -3, 117, 50, 347, -509, 183, 138, - -675, -375, -377, -476, 102, -385, -377, -382, -377, 97, - 183, 182, -511, 97, -511, 9, 10, 97, 97, -678, - 50, -503, 71, -476, -476, 97, 71, 97, -6, -4, - -5, -4, 96, 182, 96, 92, 92, -511, -476, -511, + -483, 306, 96, -517, -511, -510, 306, 97, -394, -510, + -567, 718, 717, -417, -415, -416, 92, 547, 348, 349, + 97, -691, -691, -691, -691, -418, 112, 97, -589, 96, + -184, 96, 97, 97, 97, 183, -463, -684, 96, 112, + -669, -668, -670, 29, -667, 29, -667, -667, 537, 20, + 127, 541, 541, 541, 541, -249, -249, -327, 102, -459, + 96, -600, 96, 96, 96, 40, 22, 22, 102, 6, + 550, -612, -610, -517, 97, 183, -565, 97, -416, 92, + -415, 92, 24, 23, -543, -543, -543, -543, -588, 97, + 183, -516, -483, -687, 40, 97, -683, -682, -460, -677, + 533, 534, 102, -667, 138, 633, -595, -765, -764, 735, + -580, -585, -381, -382, -383, -483, 102, -391, -392, -383, + -388, -389, -383, -559, 96, 71, 96, 71, -2, -4, + 117, 10, 50, 102, 96, 97, -511, -567, -414, 345, + 346, 40, 196, -414, 97, 96, 97, -686, -685, -461, + 97, 183, 102, 634, 102, 97, -607, 97, 183, 138, + 97, 183, 138, 97, 183, 138, -307, -483, 96, -307, + 96, 92, 102, -3, 117, 50, 347, -516, 183, 138, + -682, -382, -384, -483, 102, -392, -384, -389, -384, 97, + 183, 182, -518, 97, -518, 9, 10, 97, 97, -685, + 50, -510, 71, -483, -483, 97, 71, 97, -6, -4, + -5, -4, 96, 182, 96, 92, 92, -518, -483, -518, 10, 9, 97, 97, } @@ -14319,548 +14413,553 @@ var yyDef = [...]int{ 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 0, 352, 353, 354, 355, - 356, 357, 1247, 1248, 1249, 1250, 1251, 1252, 1253, 1254, - 1255, 1256, 0, 0, 0, 0, 892, 0, 894, 882, - 860, 861, 916, 820, 0, 0, 0, 437, 0, 0, - 0, 0, 661, 662, 663, 664, 665, 666, 667, 668, - 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, - 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, - 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, - 699, 700, 701, 702, 703, 704, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 0, 0, -2, 386, 382, 294, 295, 296, 297, - 298, 299, 300, 394, 395, 638, 0, 0, 0, 0, - 0, 1000, 1001, -2, 133, 0, 0, 0, 0, 0, - 375, 0, 366, 366, 0, 0, 1257, 1258, 1259, 1260, - 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, -2, - 0, 0, 873, 0, 821, 822, 823, 824, 825, 826, - 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, - 837, 838, 839, 840, 467, 468, 469, 463, 464, 466, - 465, 0, 0, 873, 0, 0, 0, 1016, 1050, 0, - 1070, 1071, 0, 1615, 1072, 1082, 1110, 0, 23, 0, - 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 0, 0, 18, 0, 18, 0, 0, 0, 1832, - 1833, 1834, 1835, 2456, 2809, 2777, -2, 2499, 2457, 2458, - 2700, 2701, 2588, 2604, 2449, 2858, 2859, 2860, 2861, 2862, - 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2872, - 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, - 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, - 2893, 2894, 2895, 2896, 2897, 2898, 2899, 2900, 2901, 2902, - 2903, 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, 2912, - 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, - 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, - 2418, 2419, 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, - 2428, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, - 2438, 2439, 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, - 2448, 2450, 2451, 2452, 2453, 2454, 2455, 2459, 2460, 2461, - 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, - 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, 2481, - 2482, 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, - 2492, 2493, 2494, 2495, 2496, 2497, 2498, 2500, 2501, 2502, - 2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, - 2513, 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, - 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, - 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, 2542, - 2543, 2544, 2545, 2546, 2547, 2548, 2549, 2550, 2551, 2552, - 2553, 2554, 2555, 2556, 2557, 2558, 2559, 2560, 2561, 2562, - 2563, 2564, 2565, 2566, 2567, 2568, 2569, 2570, 2571, 2572, - 2573, 2574, 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, - 2583, 2584, 2585, 2586, 2587, 2589, 2590, 2591, 2592, 2593, - 2594, 2595, 2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603, - 2605, 2607, 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, + 64, 65, 66, 67, 68, 69, 70, 0, 354, 355, + 356, 357, 358, 359, 1251, 1252, 1253, 1254, 1255, 1256, + 1257, 1258, 1259, 1260, 0, 0, 0, 0, 896, 0, + 898, 886, 864, 865, 920, 823, 0, 0, 0, 439, + 0, 0, 0, 0, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, -2, 0, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 0, 0, 388, 384, + 296, 297, 298, 299, 300, 301, 302, 396, 397, 641, + 0, 0, 0, 0, 0, 1004, 1005, -2, 135, 0, + 0, 0, 0, 0, 377, 0, 368, 368, 0, 0, + 1261, 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, + 1271, 1272, 1273, 1274, -2, 0, 0, 877, 0, 824, + 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, + 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, + 469, 470, 471, 465, 466, 468, 467, 0, 0, 877, + 0, 0, 0, 1020, 1054, 0, 1074, 1075, 0, 1633, + 1076, 1086, 1114, 0, 23, 0, 6, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 0, 0, 18, + 0, 18, 0, 0, 0, 1850, 1851, 1852, 1853, 2480, + 2833, 2801, 2417, -2, 2523, 2481, 2482, 2724, 2725, 2612, + 2628, 2473, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889, + 2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899, + 2900, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, 2909, + 2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, + 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, 2928, 2929, + 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2416, 2418, 2419, + 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, 2429, + 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, 2439, + 2440, 2441, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449, + 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, + 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, + 2470, 2471, 2472, 2474, 2475, 2476, 2477, 2478, 2479, 2483, + 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, + 2494, 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2503, + 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, 2513, + 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2524, + 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, 2533, 2534, + 2535, 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, 2544, + 2545, 2546, 2547, 2548, 2549, 2550, 2551, 2552, 2553, 2554, + 2555, 2556, 2557, 2558, 2559, 2560, 2561, 2562, 2563, 2564, + 2565, 2566, 2567, 2568, 2569, 2570, 2571, 2572, 2573, 2574, + 2575, 2576, 2577, 2578, 2579, 2580, 2581, 2582, 2583, 2584, + 2585, 2586, 2587, 2588, 2589, 2590, 2591, 2592, 2593, 2594, + 2595, 2596, 2597, 2598, 2599, 2600, 2601, 2602, 2603, 2604, + 2605, 2606, 2607, 2608, 2609, 2610, 2611, 2613, 2614, 2615, 2616, 2617, 2618, 2619, 2620, 2621, 2622, 2623, 2624, 2625, - 2626, 2627, 2628, 2629, 2630, 2631, 2632, 2633, 2634, 2635, - 2636, 2637, 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, - 2646, 2647, 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, - 2656, 2657, 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665, - 2666, 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, - 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, - 2686, 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, - 2696, 2697, 2698, 2699, 2702, 2703, 2704, 2705, 2706, 2707, + 2626, 2627, 2629, 2631, 2632, 2633, 2634, 2635, 2636, 2637, + 2638, 2639, 2640, 2641, 2642, 2643, 2644, 2645, 2646, 2647, + 2648, 2649, 2650, 2651, 2652, 2653, 2654, 2655, 2656, 2657, + 2658, 2659, 2660, 2661, 2662, 2663, 2664, 2665, 2666, 2667, + 2668, 2669, 2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, + 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, 2687, + 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, 2697, + 2698, 2699, 2700, 2701, 2702, 2703, 2704, 2705, 2706, 2707, 2708, 2709, 2710, 2711, 2712, 2713, 2714, 2715, 2716, 2717, - 2718, 2719, 2720, 2721, 2722, 2723, 2724, 2725, 2726, 2727, - 2728, 2729, 2730, 2731, 2732, 2733, -2, 2735, 2736, 2737, - 2738, 2739, 2740, 2741, 2742, 2743, 2744, 2745, 2746, 2747, - 2748, 2749, 2750, 2751, 2752, 2753, 2754, 2755, 2756, 2757, - 2758, 2759, 2760, 2761, 2762, 2763, 2764, 2765, 2766, 2767, - 2768, 2769, 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2778, - 2779, 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, - 2789, 2790, 2791, 2792, 2793, 2794, -2, -2, -2, 2798, - 2799, 2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, 2808, - 2810, 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, 2819, - 2820, 2821, 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, - 2830, 2831, 2832, 2833, 2834, 2835, 2836, 2837, 2838, 2839, - 2840, 2841, 2842, 2843, 2844, 2845, 2846, 2847, 2848, 0, - 350, 348, 2424, 2449, 2456, 2457, 2458, 2499, 2588, 2604, - 2606, 2645, 2700, 2701, 2727, 2734, 2777, 2795, 2796, 2797, - 2809, 0, 0, 1289, 0, 0, 387, 862, 863, 893, - 895, 917, 1016, 1050, 0, 883, 884, 0, 818, 0, - 1775, 433, 0, 2475, 0, 0, 444, 2786, 0, 0, - 815, 427, 428, 429, 430, 431, 432, 0, 0, 0, - 1246, 0, 0, 2817, 423, 0, 0, 83, 490, 705, - 0, 0, 0, 0, 0, 795, 795, 1135, 1135, 0, - 735, 0, 0, 0, 795, 0, 750, 742, 0, 0, - 0, 795, 0, 0, 1039, 0, 1039, 0, 798, 805, - 795, 795, -2, 795, 795, 0, 790, 795, 0, 0, - 0, 756, 757, 758, 742, 742, 761, 762, 763, 773, - 774, 806, 2393, 0, 0, 381, 2591, 2808, 1836, 0, - 0, 0, 0, 0, 237, 1424, 239, 1426, 243, 251, - 0, 0, 0, 256, 257, 260, 261, 262, 263, 264, - 0, 268, 0, 270, 273, 0, 275, 276, 0, 279, - 280, 281, 0, 291, 292, 293, 1427, 1428, 1429, 1430, - 1431, 1432, 1433, 1434, -2, 0, 164, 1287, 2348, 2215, - 0, 2221, 2238, 2255, 1929, 1930, 1931, 1932, 0, 0, - 0, 0, 0, 0, 0, 1942, 1943, 0, 1989, 2862, - 2906, 2907, 0, 1953, 1954, 1955, 1956, 1957, 1958, 0, - 175, 189, 190, 2279, 2280, 2281, 2282, 2283, 2284, 2285, - 0, 2287, 2288, 2289, 0, 1914, 1832, 0, 2871, 2881, - 0, 2895, 2902, 2903, 2904, 2905, 2894, 0, 0, 2168, - 0, 2158, 0, 0, -2, -2, 0, 0, 2672, -2, - 2908, 2909, 2910, 2868, 2891, 2899, 2900, 2901, 2872, 2911, - 2912, 2875, 2898, 2864, 2865, 2866, 2859, 2860, 2861, 2863, - 2877, 2879, 2890, 0, 2886, 2896, 2897, 2784, 0, 0, - 2835, 2873, 2874, 0, 0, 0, 0, 0, 0, 2844, - 2845, 2846, 2847, 2848, 2830, 191, 192, -2, -2, -2, - -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, - -2, -2, -2, 2179, -2, 2181, -2, 2183, -2, -2, - 2186, -2, -2, -2, -2, -2, 2192, 2193, -2, -2, - 2196, -2, -2, -2, -2, -2, -2, -2, 2170, 2171, - 2172, 2173, 2162, 2163, 2164, 2165, 2166, 2167, -2, -2, - -2, 2349, 1016, 0, 0, 1050, 1177, 0, 1050, 1048, - 1017, 0, 0, 1020, 1097, 1100, 1103, 1106, 0, 0, - 134, 135, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 376, 377, 365, 367, 0, - 371, 0, 0, 367, 364, 358, 0, 1501, 1501, 1501, - 0, 0, 1501, 0, 0, 0, 1501, 1501, 1501, 1501, - 1501, 0, 1501, 0, 0, 0, 1501, 0, 1325, 1436, - 1437, 1438, 1439, 1499, 1500, 1616, 0, 0, 0, 0, - 2737, 969, 2575, 0, 0, 977, 1032, 0, 1034, 1037, - 878, 874, 875, 876, 877, 0, 0, 0, 638, 638, - 0, 638, 0, 0, 638, 0, 638, 638, 638, 0, - 880, 2537, 2640, 2492, 2611, 2434, 2591, 2808, 0, 323, - 2672, 328, 0, 2498, 2541, 0, 0, 2562, 0, -2, - 0, 404, 1050, 0, 1017, 1041, 0, 1051, 0, 0, - 1016, 1050, 1050, 0, 1090, 0, 0, 638, 638, 0, - 0, 638, 638, 638, 638, 638, 0, 638, 638, 638, - 0, 638, 0, 638, 0, 638, 638, 638, 0, 1111, - 1112, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, - 1123, 1084, 4, 5, 18, 0, 0, 0, 0, 0, - 0, 140, 139, 0, 2352, 2388, 2292, 2293, 2294, 0, - 2375, 2297, 2379, 2379, 2379, 2379, 0, 2329, 2375, 2331, - 2332, 2333, 2375, 2335, 2336, 2337, 2338, 2379, 2379, 2379, - 2379, 2379, 2379, 0, 0, 2347, 2318, 2377, 2377, 2377, - 2375, 2354, 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305, - 2306, 2307, 2308, 2309, 2310, 2311, 2382, 2382, 2385, 2385, - 2382, 2355, 2356, 2357, 2358, 2359, 2360, 2361, 2362, 2363, - 2364, 2365, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 0, - 495, 493, 494, 2211, 0, 0, 0, 1050, -2, 0, - 1048, 967, 0, 819, 1766, 0, 0, 434, 1837, 0, - 0, 0, 446, 0, 0, 0, 448, 0, 0, 445, - 0, 0, 470, 0, 473, 456, 457, 458, 459, 460, - 452, 0, 217, 0, 425, 426, 422, 0, 479, 481, - 483, 486, 1762, 80, 84, 87, 0, 1039, 0, 707, - 795, 795, 795, 795, 723, 724, 725, 0, 1135, 0, - 0, 728, 729, 0, 730, 0, 0, 742, 795, 795, - 748, 749, 744, 743, 801, 802, 798, 0, 798, 798, - 1135, 0, 767, 768, 769, 795, 795, 775, 1040, 0, - 0, 777, 779, 798, 0, 803, 804, 1135, 0, 0, - 1135, 1135, 0, 787, 788, 0, 791, 795, 0, 794, - 0, 0, 1501, 0, 811, 744, 744, 2394, 2395, 383, - 0, 0, 0, 639, 0, 0, 0, 0, 0, 0, - 248, 244, 252, 255, 265, 272, 0, 284, 286, 289, - 245, 253, 258, 259, 266, 287, 246, 249, 250, 254, - 288, 290, 247, 267, 271, 285, 269, 274, 277, 278, - 283, 0, 218, 0, 0, 0, 0, 0, 2220, 0, - 0, 2265, 2266, 2267, 2268, 2269, 2270, 2271, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2258, 0, 0, 0, 0, - 0, 0, 0, -2, 2215, 0, 0, 1936, 1937, 1938, - 1939, 1940, 0, 1944, 0, 1990, 0, 0, 0, 0, - 0, 0, 2286, 2290, 0, 0, 2211, 2211, 0, 0, - 2211, 2207, 0, 0, 0, 0, 0, 0, 2211, 2141, - 0, 0, 2143, 2159, 0, 0, 2145, 2146, 0, 2149, - 2150, 2211, 0, 2211, 2154, 2211, 2211, 2211, 2135, 2136, - 0, 0, 0, 2207, 0, 0, 2207, 2207, 2207, 0, - 0, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, - 2207, 2207, 2207, 2207, 2207, 2207, 2207, 2207, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1050, 1016, 1041, 0, 0, -2, 0, 978, 0, 1048, - 1074, 1076, 1078, 1080, 1047, 1022, 0, 1098, 1099, 1101, - 1102, 1104, 1105, 1107, 1108, 0, 136, 0, 0, 0, - 115, 0, 0, 112, 0, 0, 0, 0, 81, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 369, 0, 374, 360, 2633, 0, 359, 0, 0, - 0, 0, 1501, 1501, 0, 0, 1286, 0, 0, 1501, - 1501, 1326, 0, 0, 0, 0, 0, 0, 0, 0, - 1501, 1501, 1501, 0, 1519, 0, 0, 0, 0, 902, - 904, 899, 0, 0, 902, 0, 0, 969, 969, 976, - 0, 1033, 0, 0, 880, 879, 0, 1150, 1151, 1152, - 1193, 1236, 1236, 0, 1236, 1197, 0, 1775, 0, 0, - 0, 0, 1513, 0, 0, 0, 0, 0, 0, 0, - 620, 814, 621, 0, 0, 2396, 0, 0, 0, 523, - 524, 0, 0, 881, 0, 302, 306, 0, 309, 0, - 2640, 0, 2640, 0, 0, 316, 0, 0, 0, 0, - 0, 0, 346, 347, 0, 0, 0, 0, 337, 340, - 1758, 1759, 1421, 1422, 341, 342, 396, 397, 0, 1041, - 1073, 1075, 1077, 1079, 999, 1042, 1043, 1083, 1085, 1086, - 1087, 0, 0, 1068, 1069, 1041, 1041, 0, 1092, 0, - 0, 0, 638, 638, 0, 0, 0, 0, 0, 638, - 0, 0, 0, 856, 0, 858, 0, 0, 638, 0, - 0, 0, 978, 1137, 1139, 1241, 175, 1113, 7, 157, - 154, 0, 18, 0, 0, 18, 18, 0, 18, 351, - 0, 2391, 2389, 2390, 0, 2296, 2376, 0, 2323, 0, - 2324, 2325, 2326, 2327, 2328, 2330, 2334, 2339, 2340, 2341, - 2342, 2343, 2344, 0, 0, 2319, 0, 2320, 2321, 2322, - 2312, 2382, 0, 2314, 2315, 0, 2316, 2317, 349, 492, - 0, 0, 2212, 1290, 0, 0, 1041, 1012, 1048, 0, - 1048, 978, 0, 0, 638, 1764, 0, 1775, 0, 0, - 0, 0, 0, 435, 0, 0, 461, 462, 0, 447, - 0, 454, 0, 449, 450, 453, 0, 0, 472, 474, - 475, 476, 477, 816, 419, 420, 421, 405, 406, 407, - 408, 409, 410, 411, 412, 413, 0, 415, 416, 417, - 418, 0, -2, 0, 0, 424, 185, 478, 0, 480, - 0, 485, 0, 487, 0, 88, 489, 0, 709, 0, - 1135, 0, 0, 1135, 1135, 0, 0, 1135, 0, 727, - 796, 797, 1136, 731, 0, 0, 739, 2168, 2591, 1413, - 744, 1135, 1135, 751, 745, 752, 800, 753, 754, 755, - 798, 1135, 1135, 1044, 0, 795, 798, 780, 799, 798, - 1775, 784, 0, 789, 792, 793, 1775, 812, 1775, 0, - 810, 759, 760, 384, 385, 0, 0, 0, 231, 232, - 233, 234, 235, 236, 238, 222, 847, 849, 1425, 0, - 1416, 0, 241, 282, 214, 0, 0, 0, 0, 2216, - 2217, 2218, 2219, 2224, 0, 0, 2227, 2230, 2233, 2236, - 0, 2262, -2, -2, 1915, 1916, 1917, 1918, 1919, 1920, - 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 2239, 2260, - 2261, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2259, 2256, 2256, 2249, 0, 1933, 1950, - 1994, 2008, 2008, 1959, 1760, 1761, 1934, 0, 0, 1987, - 1991, 0, 0, 0, 0, 0, 0, 1479, 2375, 0, - 176, 2255, 2206, 2102, 2103, 2104, 2105, 2106, 2107, 2108, - 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, 2118, - 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, - 2129, 2130, 0, 0, 2215, 0, 0, 0, 0, 2208, - 2209, 0, 0, 0, 2090, 0, 0, 2096, 2097, 2098, - 0, 1829, 0, 2169, 2142, 2160, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2131, 2132, - 2133, 2134, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1041, 1050, 1176, 1178, 0, 963, 965, - 966, 1006, 1048, 1048, 1008, 0, 978, 1024, 0, 0, - 0, 132, 137, 0, 1583, 123, 0, 0, 0, 123, - 0, 0, 0, 123, 0, 0, 0, 1397, 1515, 89, - 1396, 1517, 0, 0, 0, 0, 0, 0, 0, 378, - 379, 0, 0, 373, 361, 2633, 363, 0, 0, 0, - 0, 0, 0, 0, 1273, 0, 0, 0, 1304, 0, - 0, 0, 1341, 1342, 0, 636, 1407, 0, 0, 0, - 1423, 1483, 1497, 0, 0, 0, 1589, 1327, 1332, 1333, - 1334, 1328, 1329, 1335, 1336, 896, 905, 0, 900, 0, - 906, 0, 0, 939, 959, 934, 0, 943, 0, 0, - 0, 1035, 0, 0, 1191, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1183, 0, 0, 0, 1182, 0, - 0, 0, 0, 0, 0, 0, 1037, 1237, 0, 1239, - 1240, 1195, -2, 0, 1146, 1148, 0, 1219, 0, 2211, - 0, 0, 1591, 1037, 520, 521, 522, 532, 593, 534, - 0, 593, 593, 593, 576, 0, 0, 564, 2396, 0, - 0, 0, 0, 573, 2396, 0, 0, 2396, 2396, 2396, - 2396, 2396, 2396, 2396, 2396, 0, 0, 2396, 2396, 2396, - 2396, 2396, 2396, 2396, 2396, 2396, 2396, 2396, 0, 2396, - 2396, 2396, 2396, 2396, 1744, 2396, 0, 1514, 583, 584, - 585, 586, 591, 592, 0, 0, 537, 538, 0, 0, - 0, 0, 0, 631, 0, 0, 1340, 619, 0, 622, - 2396, 0, 2396, 0, 2397, 636, 0, 0, 1385, 0, - 0, 1148, 0, 0, 0, 0, 314, 315, 303, 0, - 304, 0, 0, 317, 318, 0, 320, 321, 322, 329, - 2492, 2611, 324, 326, 0, 0, 330, 343, 344, 345, - 0, 0, 335, 336, 0, 0, 399, 400, 402, 0, - 1048, 1088, 1054, 1055, 1058, 0, 0, 1091, 1093, 1094, - 1095, 1096, 1516, 1504, 85, 86, 2817, 841, 0, 0, - 844, 845, 846, 850, 0, 0, 1617, 854, 855, 0, - 0, 1394, 0, 1398, 1400, 1504, 1143, 0, 1140, 1242, - 0, 1244, 0, 0, 155, 18, 0, 148, 145, 0, - 0, 0, 0, 0, 2353, 2291, 2392, 0, 0, 0, - 0, 2373, 0, 0, 2313, 0, 0, 0, 138, 161, - 985, 1048, 978, 0, 980, 187, 978, 1014, 914, 959, - 887, 0, 943, 0, 0, 0, 0, 0, 1766, 0, - 0, 0, 0, 1838, 0, 439, 438, 0, 0, 455, - 0, 0, 451, 471, 0, 414, 0, 0, 0, 482, - 0, 1763, 488, 491, 706, 0, 708, 711, 795, 0, - 714, 715, 795, 0, 0, 721, 726, 734, 732, 0, - 736, 0, 739, 738, 0, 1415, 795, 746, 747, 1135, - 770, 771, 0, 0, 0, 1135, 795, 795, 783, 798, - 807, 0, 808, 1775, 0, 225, 1410, 0, 226, 230, - 220, 0, 0, 0, 1412, 1417, 0, 240, 0, 0, - 215, 216, 1574, 1583, 0, 0, 0, 163, 2225, 2228, - 2231, 2234, 2226, 2229, 2232, 2235, 2237, 0, 2240, 2256, - 2256, 2250, 0, 2241, 2256, 2256, 2251, 0, 0, 2243, - 0, 2246, 0, 1995, 2009, 2010, 1996, 2216, 1941, 0, - 1992, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1058, 0, 0, 0, 2078, 2080, 0, 0, 0, 2085, - 0, 2087, 2088, 2089, 2091, 0, 0, 0, 2095, 0, - 2140, 2161, 2144, 2147, 0, 2151, 0, 2153, 2155, 2156, - 2157, 0, 0, 0, 1050, 1052, 1052, 1050, 0, 0, - 2035, 2035, 1052, 0, 0, 0, 0, 2035, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1964, 0, 1965, 1966, 1967, 0, 1969, 2913, - 0, 2913, 0, 2913, 2913, 0, 0, 0, 1048, 1041, - 0, 1179, 978, 978, 0, 1009, 1018, 0, 0, 0, - 0, 0, 0, 1581, 0, 108, 0, 0, 0, 116, - 0, 111, 117, 0, 0, 113, 0, 0, 125, 90, - 0, 0, 1522, 1523, 0, 0, 0, 380, 368, 370, - 0, 362, 0, 1502, 1503, 0, 0, 0, 1663, 1673, - 1277, 0, 0, -2, 1306, 0, 1037, 1037, 1352, 2396, - 0, 640, 0, 0, 1409, 0, 1374, 0, 0, 1484, - 0, -2, 0, 0, -2, 0, 0, 1593, 0, 897, - 903, 0, 0, 0, 898, 914, 940, 0, 933, 956, - 0, 960, 0, 0, 947, 949, 938, 944, 0, 0, - 0, 974, 914, 914, 23, 1038, 0, 0, 0, 867, - 871, 0, 1187, 1187, 1187, 1156, 0, 0, 1159, 1184, - 1160, 1185, 0, 0, 1164, 0, 1166, 0, 1168, 0, - 1162, 1163, 1170, 1171, 0, 1161, 1194, 1238, 0, 1196, - 0, 1218, 1220, 1221, 1227, 0, 0, 0, 0, 0, - 0, 0, 516, 517, 1593, 0, 0, 1513, 1627, 554, - 0, 1788, 1789, 594, 0, 1796, 1805, 1805, 1501, 1878, - 0, 1805, 0, 0, 1807, 1808, 1660, 0, 0, 563, - 0, 0, 0, 0, 0, 0, 0, 577, 578, 0, - 0, 562, 0, 0, 604, 0, 0, 0, 0, 0, - 0, 2396, 2396, 0, 571, 572, 0, 575, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2396, 2396, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1735, 0, 0, 0, 0, 0, 0, 0, 1750, 1751, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1352, - 2396, 0, 0, 0, 0, 0, 2396, 0, 625, 640, - 1404, 1404, 1372, 1390, 0, 525, 526, 601, 0, 0, - 0, 307, 308, 0, 0, 313, 331, 333, 305, 0, - 0, 0, 332, 334, 338, 339, 398, 401, 403, 978, - 0, 1061, 1059, 1060, 1081, 1089, 82, 1505, 842, 843, - 0, 1617, 853, 1618, 1619, 1306, 859, 1395, 0, 1402, - 1135, 1144, 0, 1138, 1243, 1245, 176, 1141, 0, 158, - 18, 157, 149, 150, 0, 18, 0, 0, 0, 0, - 2295, 2381, 2380, 2345, 0, 2346, 2378, 2383, 0, 2386, - 0, 496, 0, 989, 0, 978, 1015, 981, 0, 1013, - 885, 0, 886, 0, 0, 891, 0, 974, 1399, 1767, - 1768, 0, 1771, 1772, 1773, 1774, 1765, 0, 0, 0, - 0, 0, 0, 0, 440, 441, 442, 443, 817, 0, - 186, 484, 710, 1135, 795, 1135, 0, 795, 795, 722, - 1670, 1671, 733, 740, 737, 1414, 1135, 764, 1045, 1046, - 776, 778, 1775, 1135, 1135, 795, 813, 809, 0, 0, - 0, 0, 0, 848, 0, 222, 0, 0, 242, 0, - 0, 0, 1583, 1578, 2210, 2244, 2247, 0, 2245, 2248, - 0, 0, 2257, 2252, 1935, 1945, 1988, 0, 0, 2379, - 0, 0, 0, 1997, 1998, 2379, 2379, 2002, 2375, 2377, - 2375, 2008, 2008, 0, 1480, 0, 1481, 1058, 177, 0, - 0, 0, 0, 2035, 0, 0, 0, 1830, 0, 0, - 0, 0, 0, 2031, 2035, 0, 2035, 2033, 2035, 2035, - 2053, 2036, 2054, 2035, 2035, 2035, 2035, 2035, 2060, 2035, - 2035, 2035, 2035, 2035, 2035, 2035, 2035, 0, 2035, 2035, - 2035, 2035, 0, 2037, 2040, 1968, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2280, 2281, 978, 1048, - 964, 1010, 1007, 0, 0, 0, 0, 0, 71, 71, - 1583, 0, 0, 109, 121, 122, 0, 0, 0, 0, - 131, 0, 0, 0, 0, 0, 0, 0, 1531, 1539, - 0, 372, 0, 91, 92, 94, 0, 0, 0, 0, - 0, 0, 0, 107, 1270, 0, 1271, 0, 1281, 0, - 1275, 0, 0, 1292, 1293, 1295, 0, 1298, 1299, 1300, - 0, 1307, 1308, 1310, 1311, 0, 2407, -2, -2, 2538, + 2718, 2719, 2720, 2721, 2722, 2723, 2726, 2727, 2728, 2729, + 2730, 2731, 2732, 2733, 2734, 2735, 2736, 2737, 2738, 2739, + 2740, 2741, 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749, + 2750, 2751, 2752, 2753, 2754, 2755, 2756, 2757, -2, 2759, + 2760, 2761, 2762, 2763, 2764, 2765, 2766, 2767, 2768, 2769, + 2770, 2771, 2772, 2773, 2774, 2775, 2776, 2777, 2778, 2779, + 2780, 2781, 2782, 2783, 2784, 2785, 2786, 2787, 2788, 2789, + 2790, 2791, 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, + 2800, 2802, 2803, 2804, 2805, 2806, 2807, 2808, 2809, 2810, + 2811, 2812, 2813, 2814, 2815, 2816, 2817, 2818, -2, -2, + -2, 2822, 2823, 2824, 2825, 2826, 2827, 2828, 2829, 2830, + 2831, 2832, 2834, 2835, 2836, 2837, 2838, 2839, 2840, 2841, + 2842, 2843, 2844, 2845, 2846, 2847, 2848, 2849, 2850, 2851, + 2852, 2853, 2854, 2855, 2856, 2857, 2858, 2859, 2860, 2861, + 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, + 2872, 0, 352, 350, 2417, 2448, 2473, 2480, 2481, 2482, + 2523, 2612, 2628, 2630, 2669, 2724, 2725, 2751, 2758, 2801, + 2819, 2820, 2821, 2833, 0, 0, 1294, 0, 0, 389, + 866, 867, 897, 899, 921, 1020, 1054, 0, 887, 888, + 0, 821, 0, 1793, 435, 0, 2499, 0, 0, 446, + 2810, 0, 0, 818, 429, 430, 431, 432, 433, 434, + 0, 0, 0, 1250, 0, 0, 2841, 425, 85, 492, + 708, 0, 0, 0, 0, 0, 798, 798, 1139, 1139, + 0, 738, 0, 0, 0, 798, 0, 753, 745, 0, + 0, 0, 798, 0, 0, 1043, 0, 1043, 0, 801, + 808, 798, 798, -2, 798, 798, 0, 793, 798, 0, + 0, 0, 0, 759, 760, 761, 745, 745, 764, 765, + 766, 776, 777, 809, 2411, 0, 0, 0, 0, 0, + 383, 2615, 2832, 1854, 0, 0, 0, 0, 0, 239, + 1442, 241, 1444, 245, 253, 0, 0, 0, 258, 259, + 262, 263, 264, 265, 266, 0, 270, 0, 272, 275, + 0, 277, 278, 0, 281, 282, 283, 0, 293, 294, + 295, 1445, 1446, 1447, 1448, 1449, 1450, 1451, 1452, -2, + 0, 166, 1292, 2366, 2233, 0, 2239, 2256, 2273, 1947, + 1948, 1949, 1950, 0, 0, 0, 0, 0, 0, 0, + 1960, 1961, 0, 2007, 2886, 2930, 2931, 0, 1971, 1972, + 1973, 1974, 1975, 1976, 0, 177, 191, 192, 2297, 2298, + 2299, 2300, 2301, 2302, 2303, 0, 2305, 2306, 2307, 0, + 1932, 1850, 0, 2895, 2905, 0, 2919, 2926, 2927, 2928, + 2929, 2918, 0, 0, 2186, 0, 2176, 0, 0, -2, + -2, 0, 0, 2696, -2, 2932, 2933, 2934, 2892, 2915, + 2923, 2924, 2925, 2896, 2935, 2936, 2899, 2922, 2888, 2889, + 2890, 2883, 2884, 2885, 2887, 2901, 2903, 2914, 0, 2910, + 2920, 2921, 2808, 0, 0, 2859, 2897, 2898, 0, 0, + 0, 0, 0, 0, 2868, 2869, 2870, 2871, 2872, 2854, + 193, 194, -2, -2, -2, -2, -2, -2, -2, -2, + -2, -2, -2, -2, -2, -2, -2, -2, 2197, -2, + 2199, -2, 2201, -2, -2, 2204, -2, -2, -2, -2, + -2, 2210, 2211, -2, -2, 2214, -2, -2, -2, -2, + -2, -2, -2, 2188, 2189, 2190, 2191, 2180, 2181, 2182, + 2183, 2184, 2185, -2, -2, -2, 2367, 1020, 0, 0, + 1054, 1181, 0, 1054, 1052, 1021, 0, 0, 1024, 1101, + 1104, 1107, 1110, 0, 0, 136, 137, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 378, 379, 367, 369, 0, 373, 0, 0, 369, 366, + 360, 0, 1519, 1519, 1519, 0, 0, 1519, 0, 0, + 0, 0, 1519, 1519, 1519, 1519, 1519, 0, 1519, 0, + 0, 0, 1519, 0, 1343, 1454, 1455, 1456, 1457, 1517, + 1518, 1634, 0, 0, 0, 0, 2761, 973, 2599, 0, + 0, 981, 1036, 0, 1038, 1041, 882, 878, 879, 880, + 881, 0, 0, 0, 641, 641, 0, 641, 0, 0, + 641, 0, 641, 0, 641, 641, 0, 884, 2561, 2664, + 2516, 2635, 2458, 2615, 2832, 0, 325, 2696, 330, 0, + 2522, 2565, 0, 0, 2586, 0, -2, 0, 406, 1054, + 0, 1021, 1045, 0, 1055, 0, 0, 1020, 1054, 1054, + 0, 1094, 0, 0, 641, 641, 0, 0, 641, 641, + 641, 641, 641, 0, 641, 641, 641, 0, 641, 0, + 0, 641, 0, 641, 641, 641, 0, 1115, 1116, 1118, + 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1088, + 4, 5, 18, 0, 0, 0, 0, 0, 0, 142, + 141, 0, 2370, 2406, 2310, 2311, 2312, 0, 2393, 2315, + 2397, 2397, 2397, 2397, 0, 2347, 2393, 2349, 2350, 2351, + 2393, 2353, 2354, 2355, 2356, 2397, 2397, 2397, 2397, 2397, + 2397, 0, 0, 2365, 2336, 2395, 2395, 2395, 2393, 2372, + 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, 2325, + 2326, 2327, 2328, 2329, 2400, 2400, 2403, 2403, 2400, 2373, + 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, + 2384, 2385, 2386, 2387, 2388, 2389, 2390, 0, 497, 495, + 496, 2229, 0, 0, 0, 1054, -2, 0, 1052, 971, + 0, 822, 1784, 0, 0, 436, 1855, 0, 0, 0, + 448, 0, 0, 0, 450, 0, 0, 447, 0, 0, + 472, 0, 475, 458, 459, 460, 461, 462, 454, 0, + 219, 0, 427, 428, 424, 0, 82, 86, 89, 0, + 1043, 0, 710, 798, 798, 798, 798, 726, 727, 728, + 0, 1139, 0, 0, 731, 732, 0, 733, 0, 0, + 745, 798, 798, 751, 752, 747, 746, 804, 805, 801, + 0, 801, 801, 1139, 0, 770, 771, 772, 798, 798, + 778, 1044, 0, 0, 780, 782, 801, 0, 806, 807, + 1139, 0, 0, 1139, 1139, 0, 790, 791, 0, 794, + 798, 0, 797, 0, 0, 1519, 0, 0, 814, 1336, + 0, 747, 747, 2412, 2413, 0, 481, 483, 485, 488, + 1780, 385, 0, 0, 0, 642, 0, 0, 0, 0, + 0, 0, 250, 246, 254, 257, 267, 274, 0, 286, + 288, 291, 247, 255, 260, 261, 268, 289, 248, 251, + 252, 256, 290, 292, 249, 269, 273, 287, 271, 276, + 279, 280, 285, 0, 220, 0, 0, 0, 0, 0, + 2238, 0, 0, 2283, 2284, 2285, 2286, 2287, 2288, 2289, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2276, 0, 0, + 0, 0, 0, 0, 0, -2, 2233, 0, 0, 1954, + 1955, 1956, 1957, 1958, 0, 1962, 0, 2008, 0, 0, + 0, 0, 0, 0, 2304, 2308, 0, 0, 2229, 2229, + 0, 0, 2229, 2225, 0, 0, 0, 0, 0, 0, + 2229, 2159, 0, 0, 2161, 2177, 0, 0, 2163, 2164, + 0, 2167, 2168, 2229, 0, 2229, 2172, 2229, 2229, 2229, + 2153, 2154, 0, 0, 0, 2225, 0, 0, 2225, 2225, + 2225, 0, 0, 2225, 2225, 2225, 2225, 2225, 2225, 2225, + 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, 2225, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1054, 1020, 1045, 0, 0, -2, 0, 982, + 0, 1052, 1078, 1080, 1082, 1084, 1051, 1026, 0, 1102, + 1103, 1105, 1106, 1108, 1109, 1111, 1112, 0, 138, 0, + 0, 0, 117, 0, 0, 114, 0, 0, 0, 0, + 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 371, 0, 376, 362, 2657, 0, 361, + 0, 0, 0, 0, 1519, 1519, 0, 0, 1291, 0, + 0, 1519, 1519, 1519, 1344, 0, 0, 0, 0, 0, + 0, 0, 0, 1519, 1519, 1519, 0, 1537, 0, 0, + 0, 0, 906, 908, 903, 0, 0, 906, 0, 0, + 973, 973, 980, 0, 1037, 0, 0, 884, 883, 0, + 1154, 1155, 1156, 1197, 1240, 1240, 0, 1240, 1201, 0, + 1793, 0, 0, 0, 0, 1531, 0, 0, 0, 0, + 0, 0, 0, 623, 817, 624, 0, 0, 2414, 0, + 0, 0, 0, 526, 527, 0, 0, 885, 0, 304, + 308, 0, 311, 0, 2664, 0, 2664, 0, 0, 318, + 0, 0, 0, 0, 0, 0, 348, 349, 0, 0, + 0, 0, 339, 342, 1776, 1777, 1439, 1440, 343, 344, + 398, 399, 0, 1045, 1077, 1079, 1081, 1083, 1003, 1046, + 1047, 1087, 1089, 1090, 1091, 0, 0, 1072, 1073, 1045, + 1045, 0, 1096, 0, 0, 0, 641, 641, 0, 0, + 0, 0, 0, 641, 0, 0, 0, 860, 0, 862, + 0, 641, 0, 641, 0, 0, 0, 982, 1141, 1143, + 1245, 177, 1117, 7, 159, 156, 0, 18, 0, 0, + 18, 18, 0, 18, 353, 0, 2409, 2407, 2408, 0, + 2314, 2394, 0, 2341, 0, 2342, 2343, 2344, 2345, 2346, + 2348, 2352, 2357, 2358, 2359, 2360, 2361, 2362, 0, 0, + 2337, 0, 2338, 2339, 2340, 2330, 2400, 0, 2332, 2333, + 0, 2334, 2335, 351, 494, 0, 0, 2230, 1295, 0, + 0, 1045, 1016, 1052, 0, 1052, 982, 0, 0, 641, + 1782, 0, 1793, 0, 0, 0, 0, 0, 437, 0, + 0, 463, 464, 0, 449, 0, 456, 0, 451, 452, + 455, 0, 0, 474, 476, 477, 478, 479, 819, 421, + 422, 423, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 0, 417, 418, 419, 420, 0, -2, 0, 0, + 426, 187, 90, 491, 0, 712, 0, 1139, 0, 0, + 1139, 1139, 0, 0, 1139, 0, 730, 799, 800, 1140, + 734, 0, 0, 742, 2186, 2615, 1431, 747, 1139, 1139, + 754, 748, 755, 803, 756, 757, 758, 801, 1139, 1139, + 1048, 0, 798, 801, 783, 802, 801, 1793, 787, 0, + 792, 795, 796, 1793, 815, 1793, 0, 813, 0, 0, + 762, 763, 1333, 480, 0, 482, 0, 487, 0, 489, + 0, 386, 387, 0, 0, 0, 233, 234, 235, 236, + 237, 238, 240, 224, 851, 853, 1443, 0, 1434, 0, + 243, 284, 216, 0, 0, 0, 0, 2234, 2235, 2236, + 2237, 2242, 0, 0, 2245, 2248, 2251, 2254, 0, 2280, + -2, -2, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, + 1941, 1942, 1943, 1944, 1945, 1946, 2257, 2278, 2279, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2277, 2274, 2274, 2267, 0, 1951, 1968, 2012, 2026, + 2026, 1977, 1778, 1779, 1952, 0, 0, 2005, 2009, 0, + 0, 0, 0, 0, 0, 1497, 2393, 0, 178, 2273, + 2224, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, + 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, + 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2146, 2147, 2148, + 0, 0, 2233, 0, 0, 0, 0, 2226, 2227, 0, + 0, 0, 2108, 0, 0, 2114, 2115, 2116, 0, 1847, + 0, 2187, 2160, 2178, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2149, 2150, 2151, 2152, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1045, 1054, 1180, 1182, 0, 967, 969, 970, 1010, + 1052, 1052, 1012, 0, 982, 1028, 0, 0, 0, 134, + 139, 0, 1601, 125, 0, 0, 0, 125, 0, 0, + 0, 125, 0, 0, 0, 1415, 1533, 91, 1414, 1535, + 0, 0, 0, 0, 0, 0, 0, 380, 381, 0, + 0, 375, 363, 2657, 365, 0, 0, 0, 0, 0, + 0, 0, 1278, 0, 0, 0, 1309, 0, 0, 0, + 0, 1359, 1360, 0, 639, 1425, 0, 0, 0, 1441, + 1501, 1515, 0, 0, 0, 1607, 1345, 1350, 1351, 1352, + 1346, 1347, 1353, 1354, 900, 909, 0, 904, 0, 910, + 0, 0, 943, 963, 938, 0, 947, 0, 0, 0, + 1039, 0, 0, 1195, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1187, 0, 0, 0, 1186, 0, 0, + 0, 0, 0, 0, 0, 1041, 1241, 0, 1243, 1244, + 1199, -2, 0, 1150, 1152, 0, 1223, 0, 2229, 0, + 0, 1609, 1041, 523, 524, 525, 535, 596, 537, 0, + 596, 596, 596, 579, 0, 0, 567, 2414, 0, 0, + 0, 0, 576, 2414, 0, 0, 2414, 2414, 2414, 2414, + 2414, 2414, 2414, 2414, 0, 0, 2414, 2414, 2414, 2414, + 2414, 2414, 2414, 2414, 2414, 2414, 2414, 0, 2414, 2414, + 2414, 2414, 2414, 1762, 2414, 0, 1532, 586, 587, 588, + 589, 594, 595, 0, 0, 540, 541, 0, 0, 0, + 0, 0, 634, 0, 0, 1358, 622, 0, 625, 2414, + 0, 2414, 0, 2415, 639, 0, 0, 0, 1403, 0, + 0, 1152, 0, 0, 0, 0, 316, 317, 305, 0, + 306, 0, 0, 319, 320, 0, 322, 323, 324, 331, + 2516, 2635, 326, 328, 0, 0, 332, 345, 346, 347, + 0, 0, 337, 338, 0, 0, 401, 402, 404, 0, + 1052, 1092, 1058, 1059, 1062, 0, 0, 1095, 1097, 1098, + 1099, 1100, 1534, 1522, 87, 88, 2841, 845, 0, 0, + 848, 849, 850, 854, 0, 0, 1635, 858, 859, 0, + 0, 0, 1412, 0, 1416, 1418, 1522, 1147, 0, 1144, + 1246, 0, 1248, 0, 0, 157, 18, 0, 150, 147, + 0, 0, 0, 0, 0, 2371, 2309, 2410, 0, 0, + 0, 0, 2391, 0, 0, 2331, 0, 0, 0, 140, + 163, 989, 1052, 982, 0, 984, 189, 982, 1018, 918, + 963, 891, 0, 947, 0, 0, 0, 0, 0, 1784, + 0, 0, 0, 0, 1856, 0, 441, 440, 0, 0, + 457, 0, 0, 453, 473, 0, 416, 0, 0, 0, + 0, 493, 709, 0, 711, 714, 798, 0, 717, 718, + 798, 0, 0, 724, 729, 737, 735, 0, 739, 0, + 742, 741, 0, 1433, 798, 749, 750, 1139, 773, 774, + 0, 0, 0, 1139, 798, 798, 786, 801, 810, 0, + 811, 1793, 1338, 1337, 484, 0, 1781, 490, 0, 227, + 1428, 0, 228, 232, 222, 0, 0, 0, 1430, 1435, + 0, 242, 0, 0, 217, 218, 1592, 1601, 0, 0, + 0, 165, 2243, 2246, 2249, 2252, 2244, 2247, 2250, 2253, + 2255, 0, 2258, 2274, 2274, 2268, 0, 2259, 2274, 2274, + 2269, 0, 0, 2261, 0, 2264, 0, 2013, 2027, 2028, + 2014, 2234, 1959, 0, 2010, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1062, 0, 0, 0, 2096, 2098, + 0, 0, 0, 2103, 0, 2105, 2106, 2107, 2109, 0, + 0, 0, 2113, 0, 2158, 2179, 2162, 2165, 0, 2169, + 0, 2171, 2173, 2174, 2175, 0, 0, 0, 1054, 1056, + 1056, 1054, 0, 0, 2053, 2053, 1056, 0, 0, 0, + 0, 2053, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1982, 0, 1983, 1984, + 1985, 0, 1987, 2937, 0, 2937, 0, 2937, 2937, 0, + 0, 0, 1052, 1045, 0, 1183, 982, 982, 0, 1013, + 1022, 0, 0, 0, 0, 0, 0, 1599, 0, 110, + 0, 0, 0, 118, 0, 113, 119, 0, 0, 115, + 0, 0, 127, 92, 0, 0, 1540, 1541, 0, 0, + 0, 382, 370, 372, 0, 364, 0, 1520, 1521, 0, + 0, 0, 1681, 1691, 1282, 0, 0, -2, 1311, 0, + 1041, 0, 1041, 1370, 2414, 0, 643, 0, 0, 1427, + 0, 1392, 0, 0, 1502, 0, -2, 0, 0, -2, + 0, 0, 1611, 0, 901, 907, 0, 0, 0, 902, + 918, 944, 0, 937, 960, 0, 964, 0, 0, 951, + 953, 942, 948, 0, 0, 0, 978, 918, 918, 23, + 1042, 0, 0, 0, 871, 875, 0, 1191, 1191, 1191, + 1160, 0, 0, 1163, 1188, 1164, 1189, 0, 0, 1168, + 0, 1170, 0, 1172, 0, 1166, 1167, 1174, 1175, 0, + 1165, 1198, 1242, 0, 1200, 0, 1222, 1224, 1225, 1231, + 0, 0, 0, 0, 0, 0, 0, 519, 520, 1611, + 0, 0, 1531, 1645, 557, 0, 1806, 1807, 597, 0, + 1814, 1823, 1823, 1519, 1896, 0, 1823, 0, 0, 1825, + 1826, 1678, 0, 0, 566, 0, 0, 0, 0, 0, + 0, 0, 580, 581, 0, 0, 565, 0, 0, 607, + 0, 0, 0, 0, 0, 0, 2414, 2414, 0, 574, + 575, 0, 578, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2414, 2414, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1753, 0, 0, 0, 0, + 0, 0, 0, 1768, 1769, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1370, 2414, 0, 0, 0, 0, + 0, 2414, 0, 628, 643, 1422, 1422, 1335, 0, 1390, + 1408, 0, 528, 529, 604, 0, 0, 0, 309, 310, + 0, 0, 315, 333, 335, 307, 0, 0, 0, 334, + 336, 340, 341, 400, 403, 405, 982, 0, 1065, 1063, + 1064, 1085, 1093, 84, 1523, 846, 847, 0, 1635, 857, + 1636, 1637, 1311, 863, 1334, 1413, 0, 1420, 1139, 1148, + 0, 1142, 1247, 1249, 178, 1145, 0, 160, 18, 159, + 151, 152, 0, 18, 0, 0, 0, 0, 2313, 2399, + 2398, 2363, 0, 2364, 2396, 2401, 0, 2404, 0, 498, + 0, 993, 0, 982, 1019, 985, 0, 1017, 889, 0, + 890, 0, 0, 895, 0, 978, 1417, 1785, 1786, 0, + 1789, 1790, 1791, 1792, 1783, 0, 0, 0, 0, 0, + 0, 0, 442, 443, 444, 445, 820, 0, 188, 713, + 1139, 798, 1139, 0, 798, 798, 725, 1688, 1689, 736, + 743, 740, 1432, 1139, 767, 1049, 1050, 779, 781, 1793, + 1139, 1139, 798, 816, 812, 486, 0, 0, 0, 0, + 0, 852, 0, 224, 0, 0, 244, 0, 0, 0, + 1601, 1596, 2228, 2262, 2265, 0, 2263, 2266, 0, 0, + 2275, 2270, 1953, 1963, 2006, 0, 0, 2397, 0, 0, + 0, 2015, 2016, 2397, 2397, 2020, 2393, 2395, 2393, 2026, + 2026, 0, 1498, 0, 1499, 1062, 179, 0, 0, 0, + 0, 2053, 0, 0, 0, 1848, 0, 0, 0, 0, + 0, 2049, 2053, 0, 2053, 2051, 2053, 2053, 2071, 2054, + 2072, 2053, 2053, 2053, 2053, 2053, 2078, 2053, 2053, 2053, + 2053, 2053, 2053, 2053, 2053, 0, 2053, 2053, 2053, 2053, + 0, 2055, 2058, 1986, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2298, 2299, 982, 1052, 968, 1014, + 1011, 0, 0, 0, 0, 0, 73, 73, 1601, 0, + 0, 111, 123, 124, 0, 0, 0, 0, 133, 0, + 0, 0, 0, 0, 0, 0, 1549, 1557, 0, 374, + 0, 93, 94, 96, 0, 0, 0, 0, 0, 0, + 0, 109, 1275, 0, 1276, 0, 1286, 0, 1280, 0, + 0, 1297, 1298, 1300, 0, 1303, 1304, 1305, 0, 1312, + 1313, 1315, 1316, 0, 2431, -2, -2, 2562, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, - -2, -2, -2, -2, -2, 2466, -2, -2, -2, -2, + -2, -2, -2, 2490, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, - -2, -2, -2, -2, 1305, 0, 0, 1356, 1353, 1354, - 1355, 0, 0, 1404, 641, 642, 643, 644, 0, 0, - 0, 1408, 0, 0, 0, 1365, 0, 0, 0, 1485, - 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, -2, - 1508, 0, 1775, 0, 0, 1781, 1563, 0, 0, 0, - 1570, 0, 0, 1003, 0, -2, -2, 1781, 1561, 2396, - 1781, 1601, 0, 1590, 0, 0, 901, 910, 0, 959, - 961, 0, 0, 959, 0, 0, 0, 970, 0, 971, - 0, 0, 911, 912, 914, 0, 1192, 967, 0, -2, - 0, 0, 869, 0, 0, 1153, 1188, 0, 0, 1154, - 1155, 1157, 1174, 1186, 0, 1180, 1165, 1167, 1169, 1172, - 0, 1147, 0, 1222, 0, 0, 1224, 1225, 1226, 0, - 1199, 512, 0, 1665, 0, 1668, 1669, 514, 0, 1675, - 0, 1678, 1679, 1601, 1592, 0, 533, 593, 593, 0, - 547, 0, 595, 0, 0, 1795, 1826, 1806, 1826, 1826, - 1879, 1826, 1826, 1501, 0, 1648, 0, 0, 1654, 0, - 1661, 0, 0, 0, 0, 0, 595, 0, 0, 565, - 561, 598, 1058, 548, 550, 551, 552, 602, 603, 605, - 0, 607, 608, 609, 567, 579, 580, 581, 582, 0, - 0, 0, 574, 587, 588, 589, 590, 549, 1711, 1712, - 1713, 1714, 1717, 1718, 1719, 1720, 0, 0, 1723, 1724, - 1725, 1726, 1727, 1823, 1824, 1825, 1728, 1729, 1730, 1731, - 1732, 1733, 1734, 1752, 1753, 1754, 1755, 1756, 1757, 1736, - 1737, 1738, 1739, 1740, 1741, 1742, 1743, 0, 0, 1747, - 0, 0, 1275, 0, 541, 542, 0, 544, 0, 0, - 1356, 0, 0, 0, 0, 0, 623, 0, 626, 1404, - 634, 0, 0, 635, 1374, 0, 1392, 0, 1386, 1387, - 0, 0, 931, 1135, 391, 0, 1135, 301, 310, 311, - 312, 319, 0, 660, 325, 1064, 1056, 1057, 0, 851, - 852, 0, 0, 1126, 1145, 0, 153, 156, 0, 151, - 0, 0, 0, 0, 143, 141, 2374, 0, 0, 162, - 991, 202, 0, 0, 1064, 983, 0, 188, 915, 0, - 959, 968, 0, 1776, 1777, 1778, 1779, 0, 1839, 436, - 0, 712, 1135, 716, 795, 1135, 1135, 0, 741, 781, - 785, 782, 1135, 0, 1411, 222, 227, 228, 229, 223, - 221, 1418, 0, 1420, 0, 1576, 0, 0, 2253, 2254, - 2242, 1993, 1946, 2323, 0, 1949, 1951, 1999, 2000, 2003, - 2004, 2005, 2006, 2007, 1952, 0, 1482, 2079, 2081, 0, - 2083, 2084, 2086, 2092, 2093, 0, 0, 2148, 2152, 0, - 0, 2139, 0, 0, 2048, 0, 2049, 0, 0, 2051, - 2052, 2055, 2056, 2057, 2058, 2059, 2061, 2062, 2063, 2064, - 2065, 2066, 2067, 2068, 0, 2070, 2071, 2072, 2073, 0, - 0, 2029, 2041, 1970, 2914, 2913, 0, 1973, 2913, 0, - 1976, 1977, 2915, 0, 0, 0, 0, 0, 0, 1064, - 978, 1049, 0, 0, 1027, 1028, 1029, 1030, 1031, 1023, - 0, 0, 73, 0, 73, 1582, 1584, 124, 126, 0, - 0, 118, 119, 120, 0, 0, 0, 1241, 1545, 1775, - 1533, 0, 1525, 0, 1539, 0, 0, 0, 93, 0, - 95, 0, 2594, 0, 0, 0, 0, 1504, 0, 0, - 1283, 0, 0, 1274, 0, 1285, 1301, 1297, 0, 0, - 0, 1312, 0, 0, 1323, 0, 0, 1344, 1345, 1346, - 1370, 1358, 0, 646, 647, 0, 0, 0, 659, 655, - 656, 657, 637, 1403, 1381, 0, 0, 1381, 1368, 0, - 0, 1380, 0, 1509, 2396, 2396, 2396, 1545, 0, 0, - 0, 1782, 1783, 1785, 1786, 1787, 1565, 0, 1569, 1547, - 0, 1050, 0, 0, 0, 1604, 0, 0, 1595, 0, - 0, 908, 0, 957, 0, 962, 959, 937, 948, 936, - 950, 945, 946, 975, 0, 972, 913, 1036, 1236, 0, - 0, 1135, 868, 871, 872, 0, 1189, 0, 1158, 0, - 1181, 1173, 1149, 1231, 1228, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1604, 519, 0, 0, 1629, 0, - 566, 596, 0, 0, 2919, -2, 0, 1827, 0, 0, - 1809, 1827, 0, 0, 1826, 0, 1625, 0, 0, 0, - 0, 0, 1658, 0, 1441, 1441, 1441, 1441, 1441, 0, - 0, 610, 0, 614, 615, 612, 1873, 0, 0, 613, - 555, 595, 0, 0, 600, 0, 606, 1715, 1716, 0, - 1721, 1722, 0, 1746, 0, 0, 536, 539, 0, 1279, - 1280, -2, 0, 0, 0, 618, 0, 0, 0, 627, - 628, 624, 633, 1405, 1406, 1365, 0, 1381, 0, 1391, - 0, 1388, 1389, 1050, 0, 0, 0, 914, 327, 1005, - 0, 0, 1062, 1063, 857, 0, 1124, 0, 1142, 0, - 18, 0, 0, 146, 2384, 2387, 993, 0, 990, 203, - 0, 0, 0, 1011, 985, 0, 982, 959, 890, 889, - 0, 1770, 1780, 713, 1135, 718, 719, 0, 786, 224, - 219, 1419, 1586, 0, 1577, 0, 0, 0, 1898, 1961, - 1962, 1963, 0, 2094, 1831, 0, 0, 1052, 2032, 0, - 2035, 2034, 0, 2035, 2038, 1050, 2030, 0, 0, 0, - 0, 0, 2913, 0, 1979, 0, 1981, 1982, 1983, 0, - 1985, 1986, 2350, 1064, 1025, 0, 1021, 0, 69, 0, - 72, 70, 110, 0, 114, 0, 0, 130, 1520, 0, - 1545, 1524, 0, 0, 0, 1526, 0, 0, 0, 0, - 0, 96, 0, 0, 0, 0, 0, 0, 105, 0, - 0, 0, 0, 1282, 0, 1276, 0, 0, 1294, 1296, - 0, 1309, 0, 1330, 1330, 1357, 1343, 0, 1324, 0, - 0, 648, 649, 0, 652, 658, 1359, 0, 0, 1362, - 1363, 1361, 1364, 0, 0, 1378, 0, 0, 0, 0, - 1495, 0, 1498, -2, 0, 1567, 1545, 0, 0, 1041, - 0, 1663, -2, 1610, 0, 1602, 0, 1594, 0, 1597, - 907, 0, 0, 942, 958, 935, 0, 0, 1135, 1135, - -2, 914, 870, 0, 918, 920, 0, 0, 1175, 0, - 0, 1232, 1234, 1229, 1230, 0, 1666, 513, 1667, 1676, - 515, 1677, 1680, 1681, 1610, 0, 1628, 0, 1642, 597, - 2917, 0, 1828, -2, 1842, 1844, 0, 0, 1514, 1848, - 1849, 0, 0, 0, 0, 0, 0, 0, 0, 1906, - 1859, 0, 0, 0, 1864, 1865, 1866, 0, 0, 0, - 0, 2274, 2275, 0, 1877, 0, 0, 0, 0, 0, - 0, 0, 0, 1803, 1627, 0, 1649, 0, 0, 0, - 0, 0, 0, 0, 527, 528, 529, 530, 531, 0, - 559, 560, 1441, 0, 1874, 1875, 556, 557, 599, 553, - 2396, 569, 1745, 1748, 1749, 540, 543, 0, 0, 632, - 629, 630, 1368, 1373, 1384, 1393, 932, 1039, 1135, 392, - 393, 389, 1065, 1066, 0, 1401, 2042, 0, 0, 147, - 152, 0, 0, 995, 0, 992, 0, 986, 988, 213, - 989, 984, 888, 1769, 717, 795, 171, 205, 0, 0, - 0, 1948, 0, 0, 0, 0, 2082, 2137, 2138, 2035, - 0, 2050, 2035, 2074, 2026, 0, 1971, 2913, 1974, 2913, - 0, 2916, 0, 0, 2351, 0, 1019, 74, 128, 127, - 0, 0, 1521, 0, 0, 0, 1537, 1538, 0, 1540, - 1541, 1542, 0, 0, 0, 0, 78, 0, 0, 0, - 1504, 0, 1504, 0, 0, 0, 1664, 1674, 0, 1284, - 1278, 1288, 1302, 0, 1315, 1313, 1322, 1337, 1321, 0, - 0, 0, 645, 650, 0, 653, 654, 1382, 1381, 0, - 1366, 1367, 0, 1376, 0, 0, 1510, 1511, 1512, 1370, - 1620, 1564, 0, 0, -2, 1708, 0, 1784, 1571, 1548, - 0, 1004, 1555, 1556, 1557, 1558, 1559, 1560, 1586, 2396, - 1662, 1620, 1598, 0, 1605, 0, 1603, 1596, 0, 941, - 951, 973, 1050, 914, 865, 0, 921, 929, 0, 0, - 928, 1190, 1223, 0, 0, 1607, 0, 1630, -2, 0, - 2920, 1843, 1845, 1846, 1847, 1850, 1851, 1852, 1853, 1854, - 1911, 1912, 1913, 0, 0, 1857, 1908, 1909, 1910, 1858, - 0, 0, 0, 1863, 0, 0, 0, 2272, 2273, 1904, - 0, 0, 0, 1810, 1812, 1813, 1814, 1815, 1816, 1817, - 1818, 1819, 1820, 1821, 1822, 1811, 0, 0, 0, 1802, - 1804, 535, 1660, 1650, 0, 1652, 0, 0, 0, 0, - 1442, 2396, 2396, 0, 0, 0, 1452, 1453, 2396, 2396, - 2396, 2396, 2396, 2396, 0, 0, 0, 2396, 2396, 2396, - 2396, 2396, 2396, 0, 1471, 1472, 1473, 0, 2396, 2396, - 2396, 558, 611, 0, 0, 2396, 0, 0, 1383, 914, - 914, 0, 1109, 0, 1125, 1133, 2835, 2837, 2834, 142, - 144, 159, 0, 994, 204, 0, 991, 1135, 173, 0, - 196, 0, 1587, 0, 0, 2001, 1960, 0, 0, 0, - 0, 2047, 1053, 2069, 2039, 2027, 0, 2021, 2022, 2023, - 2028, 0, 0, 1978, 1980, 1984, 1026, 0, 1546, 1534, - 1535, 1536, 1532, 0, 0, 1543, 1544, 0, 76, 0, - 99, 0, 0, 100, 1504, 101, 1504, 0, 0, 1272, - 0, 0, 1338, 1339, 1347, 1348, 0, 1350, 1351, 1371, - 651, 1360, 1369, 1375, 1378, 0, 1443, 1496, 1622, 0, - 1566, 0, 1513, 1710, 2396, 1370, 1573, 0, 1622, 1588, - 0, 1600, 0, 1612, 0, 1606, 0, 1039, 866, 919, - 0, 0, 929, 929, 1233, 1235, 0, 1200, 0, -2, - 518, 0, 1609, 2918, 1631, -2, 0, 1639, 1641, 0, - 0, 1855, 1856, 0, 0, 2158, 2396, 0, 0, 1893, - 0, 1441, 1441, 1441, 1441, 1441, 0, 1646, 1651, 1653, - 1655, 0, 1659, 1657, 0, 0, 1449, 1450, 0, 0, - 0, 0, 0, 0, 0, 0, 1461, 1462, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 616, - 617, 568, 0, 0, 546, 388, 390, 1067, 2043, 2044, - 0, 1127, 0, 0, 0, 0, 0, 0, 993, 720, - 160, 0, 172, 193, 0, 206, 207, 0, 0, 0, - 0, 1579, 1947, 0, 1901, 1903, 1902, 2024, 0, 0, - 0, 0, 0, 0, 2276, 2277, 2278, 1972, 1975, 129, - 1539, 1539, 1504, 78, 0, 98, 0, 102, 103, 0, - 1504, 0, 1314, 0, 1349, 1377, 1379, 1440, 1554, 0, - 1660, 1568, 1709, 0, 1572, 1673, 1683, 1697, 1690, 1695, - 1696, 1562, 1599, 1611, 0, 1614, 909, 914, 0, 930, - 0, 0, 0, 0, 0, 0, 0, 1207, 1608, 1632, - 1640, 0, 1635, 0, 0, 0, 1907, 0, 1862, 0, - 0, 1870, 1881, 1894, 0, 0, 1790, 0, 1792, 1793, - 0, 1797, 0, 1799, 0, 0, 1626, 0, 1656, 1447, - 1448, 1451, 1454, 1455, 1456, 1457, 1458, 1459, 0, 1463, - 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1474, 1475, 1476, - 1477, 1478, 570, 545, 0, 0, 1134, 0, 0, 0, - 0, 997, 987, 995, 174, 178, 0, 202, 199, 0, - 208, 0, 0, 0, 0, 1575, 0, 1899, 0, 2011, - 0, 0, 0, 0, 2016, 2017, 2018, 2019, 2020, 1527, - 1539, 1528, 1539, 75, 77, 79, 97, 1504, 104, 0, - 1316, 1317, 1331, 1444, 1445, 1446, 0, 1648, 1715, 1672, - 1682, 0, 1688, 0, 1689, 0, 1613, 864, 0, 923, - 0, 0, 1198, 1201, 1202, 0, 0, 0, 1634, 0, - -2, 1643, 0, 0, 2213, 2222, 2223, 1860, 1867, 0, - 1869, 1871, 1872, 1880, 1882, 1883, 0, 1895, 1896, 1897, - 1905, 1441, 1441, 1441, 1441, 1801, 1647, 1460, 2045, 2040, - 0, 2211, 1129, 1130, 996, 0, 979, 165, 0, 0, - 197, 198, 200, 0, 209, 0, 211, 212, 0, 0, - 0, 2012, 2013, 2014, 2015, 1529, 1530, 106, 1318, 1623, - 0, 1625, 0, 0, 0, 0, 0, 0, 1211, 0, - 0, 1636, -2, 0, 1645, 0, 1861, 1870, 1884, 0, - 1885, 0, 0, 0, 1791, 1794, 1798, 1800, 0, 1128, - 0, 0, 998, 1585, 0, 179, 0, 181, 183, 184, - 194, 195, 201, 210, 0, 0, 2025, 1303, 1319, 0, - 0, 1627, 0, 1685, 0, 1702, 1703, 0, 1699, 0, - 0, 1692, 0, 922, 0, 0, 0, 0, 1203, 0, - 1208, 1209, 0, 1204, 0, 1644, 2214, 1868, 1886, 1888, - 1889, 0, 0, 1887, 2046, 2211, 1131, 166, 167, 0, - 180, 0, 1580, 1900, 1320, 1624, 1621, 1684, 0, 0, - 1698, 0, 0, 1691, 0, 0, 0, 952, 0, 0, - 0, 0, 1210, 0, 1890, 1892, 1891, 0, 0, 0, - 182, 1686, 1687, 1704, 1705, 1700, 1701, 1693, 1694, 0, - 0, 0, 0, 0, 0, 1216, 1214, 1205, 1132, 168, - 169, 170, 0, 954, 953, 926, 0, 927, 1212, 0, - 1213, 0, 0, 0, 0, 0, 0, 0, 955, 0, - 1217, 1215, 924, 925, + -2, -2, 1310, 0, 0, 0, 1374, 1371, 1372, 1373, + 0, 0, 1422, 644, 645, 646, 647, 0, 0, 0, + 1426, 0, 0, 0, 1383, 0, 0, 0, 1503, 1504, + 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, -2, 1526, + 0, 1793, 0, 0, 1799, 1581, 0, 0, 0, 1588, + 0, 0, 1007, 0, -2, -2, 1799, 1579, 2414, 1799, + 1619, 0, 1608, 0, 0, 905, 914, 0, 963, 965, + 0, 0, 963, 0, 0, 0, 974, 0, 975, 0, + 0, 915, 916, 918, 0, 1196, 971, 0, -2, 0, + 0, 873, 0, 0, 1157, 1192, 0, 0, 1158, 1159, + 1161, 1178, 1190, 0, 1184, 1169, 1171, 1173, 1176, 0, + 1151, 0, 1226, 0, 0, 1228, 1229, 1230, 0, 1203, + 515, 0, 1683, 0, 1686, 1687, 517, 0, 1693, 0, + 1696, 1697, 1619, 1610, 0, 536, 596, 596, 0, 550, + 0, 598, 0, 0, 1813, 1844, 1824, 1844, 1844, 1897, + 1844, 1844, 1519, 0, 1666, 0, 0, 1672, 0, 1679, + 0, 0, 0, 0, 0, 598, 0, 0, 568, 564, + 601, 1062, 551, 553, 554, 555, 605, 606, 608, 0, + 610, 611, 612, 570, 582, 583, 584, 585, 0, 0, + 0, 577, 590, 591, 592, 593, 552, 1729, 1730, 1731, + 1732, 1735, 1736, 1737, 1738, 0, 0, 1741, 1742, 1743, + 1744, 1745, 1841, 1842, 1843, 1746, 1747, 1748, 1749, 1750, + 1751, 1752, 1770, 1771, 1772, 1773, 1774, 1775, 1754, 1755, + 1756, 1757, 1758, 1759, 1760, 1761, 0, 0, 1765, 0, + 0, 1280, 0, 544, 545, 0, 547, 0, 0, 1374, + 0, 0, 0, 0, 0, 626, 0, 629, 1422, 637, + 0, 0, 638, 1327, 0, 1392, 0, 1410, 0, 1404, + 1405, 0, 0, 935, 1139, 393, 0, 1139, 303, 312, + 313, 314, 321, 0, 663, 327, 1068, 1060, 1061, 0, + 855, 856, 0, 0, 1130, 1149, 0, 155, 158, 0, + 153, 0, 0, 0, 0, 145, 143, 2392, 0, 0, + 164, 995, 204, 0, 0, 1068, 987, 0, 190, 919, + 0, 963, 972, 0, 1794, 1795, 1796, 1797, 0, 1857, + 438, 0, 715, 1139, 719, 798, 1139, 1139, 0, 744, + 784, 788, 785, 1139, 0, 1429, 224, 229, 230, 231, + 225, 223, 1436, 0, 1438, 0, 1594, 0, 0, 2271, + 2272, 2260, 2011, 1964, 2341, 0, 1967, 1969, 2017, 2018, + 2021, 2022, 2023, 2024, 2025, 1970, 0, 1500, 2097, 2099, + 0, 2101, 2102, 2104, 2110, 2111, 0, 0, 2166, 2170, + 0, 0, 2157, 0, 0, 2066, 0, 2067, 0, 0, + 2069, 2070, 2073, 2074, 2075, 2076, 2077, 2079, 2080, 2081, + 2082, 2083, 2084, 2085, 2086, 0, 2088, 2089, 2090, 2091, + 0, 0, 2047, 2059, 1988, 2938, 2937, 0, 1991, 2937, + 0, 1994, 1995, 2939, 0, 0, 0, 0, 0, 0, + 1068, 982, 1053, 0, 0, 1031, 1032, 1033, 1034, 1035, + 1027, 0, 0, 75, 0, 75, 1600, 1602, 126, 128, + 0, 0, 120, 121, 122, 0, 0, 0, 1245, 1563, + 1793, 1551, 0, 1543, 0, 1557, 0, 0, 0, 95, + 0, 97, 0, 2618, 0, 0, 0, 0, 1522, 0, + 0, 1288, 0, 0, 1279, 0, 1290, 1306, 1302, 0, + 0, 0, 1317, 0, 0, 0, 1341, 0, 0, 1362, + 1363, 1364, 1388, 1376, 0, 649, 650, 0, 0, 0, + 662, 658, 659, 660, 640, 1421, 1399, 0, 0, 1399, + 1386, 0, 0, 1398, 0, 1527, 2414, 2414, 2414, 1563, + 0, 0, 0, 1800, 1801, 1803, 1804, 1805, 1583, 0, + 1587, 1565, 0, 1054, 0, 0, 0, 1622, 0, 0, + 1613, 0, 0, 912, 0, 961, 0, 966, 963, 941, + 952, 940, 954, 949, 950, 979, 0, 976, 917, 1040, + 1240, 0, 0, 1139, 872, 875, 876, 0, 1193, 0, + 1162, 0, 1185, 1177, 1153, 1235, 1232, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1622, 522, 0, 0, + 1647, 0, 569, 599, 0, 0, 2943, -2, 0, 1845, + 0, 0, 1827, 1845, 0, 0, 1844, 0, 1643, 0, + 0, 0, 0, 0, 1676, 0, 1459, 1459, 1459, 1459, + 1459, 0, 0, 613, 0, 617, 618, 615, 1891, 0, + 0, 616, 558, 598, 0, 0, 603, 0, 609, 1733, + 1734, 0, 1739, 1740, 0, 1764, 0, 0, 539, 542, + 0, 1284, 1285, -2, 0, 0, 0, 621, 0, 0, + 0, 630, 631, 627, 636, 1423, 1424, 0, 1383, 0, + 1399, 0, 1409, 0, 1406, 1407, 1054, 0, 0, 0, + 918, 329, 1009, 0, 0, 1066, 1067, 861, 0, 1128, + 0, 1146, 0, 18, 0, 0, 148, 2402, 2405, 997, + 0, 994, 205, 0, 0, 0, 1015, 989, 0, 986, + 963, 894, 893, 0, 1788, 1798, 716, 1139, 721, 722, + 0, 789, 226, 221, 1437, 1604, 0, 1595, 0, 0, + 0, 1916, 1979, 1980, 1981, 0, 2112, 1849, 0, 0, + 1056, 2050, 0, 2053, 2052, 0, 2053, 2056, 1054, 2048, + 0, 0, 0, 0, 0, 2937, 0, 1997, 0, 1999, + 2000, 2001, 0, 2003, 2004, 2368, 1068, 1029, 0, 1025, + 0, 71, 0, 74, 72, 112, 0, 116, 0, 0, + 132, 1538, 0, 1563, 1542, 0, 0, 0, 1544, 0, + 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, + 0, 107, 0, 0, 0, 0, 1287, 0, 1281, 0, + 0, 1299, 1301, 0, 1314, 0, 1348, 1326, 1348, 1375, + 1361, 0, 1342, 0, 0, 651, 652, 0, 655, 661, + 1377, 0, 0, 1380, 1381, 1379, 1382, 0, 0, 1396, + 0, 0, 0, 0, 1513, 0, 1516, -2, 0, 1585, + 1563, 0, 0, 1045, 0, 1681, -2, 1628, 0, 1620, + 0, 1612, 0, 1615, 911, 0, 0, 946, 962, 939, + 0, 0, 1139, 1139, -2, 918, 874, 0, 922, 924, + 0, 0, 1179, 0, 0, 1236, 1238, 1233, 1234, 0, + 1684, 516, 1685, 1694, 518, 1695, 1698, 1699, 1628, 0, + 1646, 0, 1660, 600, 2941, 0, 1846, -2, 1860, 1862, + 0, 0, 1532, 1866, 1867, 0, 0, 0, 0, 0, + 0, 0, 0, 1924, 1877, 0, 0, 0, 1882, 1883, + 1884, 0, 0, 0, 0, 2292, 2293, 0, 1895, 0, + 0, 0, 0, 0, 0, 0, 0, 1821, 1645, 0, + 1667, 0, 0, 0, 0, 0, 0, 0, 530, 531, + 532, 533, 534, 0, 562, 563, 1459, 0, 1892, 1893, + 559, 560, 602, 556, 2414, 572, 1763, 1766, 1767, 543, + 546, 0, 0, 635, 632, 633, 0, 1386, 1391, 1402, + 1411, 936, 1043, 1139, 394, 395, 391, 1069, 1070, 0, + 1419, 2060, 0, 0, 149, 154, 0, 0, 999, 0, + 996, 0, 990, 992, 215, 993, 988, 892, 1787, 720, + 798, 173, 207, 0, 0, 0, 1966, 0, 0, 0, + 0, 2100, 2155, 2156, 2053, 0, 2068, 2053, 2092, 2044, + 0, 1989, 2937, 1992, 2937, 0, 2940, 0, 0, 2369, + 0, 1023, 76, 130, 129, 0, 0, 1539, 0, 0, + 0, 1555, 1556, 0, 1558, 1559, 1560, 0, 0, 0, + 0, 80, 0, 0, 0, 1522, 0, 1522, 0, 0, + 0, 1682, 1692, 0, 1289, 1283, 1293, 1307, 0, 1320, + 1318, 1340, 1355, 1339, 0, 0, 0, 648, 653, 0, + 656, 657, 1400, 1399, 0, 1384, 1385, 0, 1394, 0, + 0, 1528, 1529, 1530, 1388, 1638, 1582, 0, 0, -2, + 1726, 0, 1802, 1589, 1566, 0, 1008, 1573, 1574, 1575, + 1576, 1577, 1578, 1604, 2414, 1680, 1638, 1616, 0, 1623, + 0, 1621, 1614, 0, 945, 955, 977, 1054, 918, 869, + 0, 925, 933, 0, 0, 932, 1194, 1227, 0, 0, + 1625, 0, 1648, -2, 0, 2944, 1861, 1863, 1864, 1865, + 1868, 1869, 1870, 1871, 1872, 1929, 1930, 1931, 0, 0, + 1875, 1926, 1927, 1928, 1876, 0, 0, 0, 1881, 0, + 0, 0, 2290, 2291, 1922, 0, 0, 0, 1828, 1830, + 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, + 1829, 0, 0, 0, 1820, 1822, 538, 1678, 1668, 0, + 1670, 0, 0, 0, 0, 1460, 2414, 2414, 0, 0, + 0, 1470, 1471, 2414, 2414, 2414, 2414, 2414, 2414, 0, + 0, 0, 2414, 2414, 2414, 2414, 2414, 2414, 0, 1489, + 1490, 1491, 0, 2414, 2414, 2414, 561, 614, 0, 0, + 2414, 0, 0, 1328, 1329, 1330, 1331, 1332, 1401, 918, + 918, 0, 1113, 0, 1129, 1137, 2859, 2861, 2858, 144, + 146, 161, 0, 998, 206, 0, 995, 1139, 175, 0, + 198, 0, 1605, 0, 0, 2019, 1978, 0, 0, 0, + 0, 2065, 1057, 2087, 2057, 2045, 0, 2039, 2040, 2041, + 2046, 0, 0, 1996, 1998, 2002, 1030, 0, 1564, 1552, + 1553, 1554, 1550, 0, 0, 1561, 1562, 0, 78, 0, + 101, 0, 0, 102, 1522, 103, 1522, 0, 0, 1277, + 0, 0, 1356, 1357, 1365, 1366, 0, 1368, 1369, 1389, + 654, 1378, 1387, 1393, 1396, 0, 1461, 1514, 1640, 0, + 1584, 0, 1531, 1728, 2414, 1388, 1591, 0, 1640, 1606, + 0, 1618, 0, 1630, 0, 1624, 0, 1043, 870, 923, + 0, 0, 933, 933, 1237, 1239, 0, 1204, 0, -2, + 521, 0, 1627, 2942, 1649, -2, 0, 1657, 1659, 0, + 0, 1873, 1874, 0, 0, 2176, 2414, 0, 0, 1911, + 0, 1459, 1459, 1459, 1459, 1459, 0, 1664, 1669, 1671, + 1673, 0, 1677, 1675, 0, 0, 1467, 1468, 0, 0, + 0, 0, 0, 0, 0, 0, 1479, 1480, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 619, + 620, 571, 0, 0, 549, 390, 392, 1071, 2061, 2062, + 0, 1131, 0, 0, 0, 0, 0, 0, 997, 723, + 162, 0, 174, 195, 0, 208, 209, 0, 0, 0, + 0, 1597, 1965, 0, 1919, 1921, 1920, 2042, 0, 0, + 0, 0, 0, 0, 2294, 2295, 2296, 1990, 1993, 131, + 1557, 1557, 1522, 80, 0, 100, 0, 104, 105, 0, + 1522, 0, 1319, 0, 1367, 1395, 1397, 1458, 1572, 0, + 1678, 1586, 1727, 0, 1590, 1691, 1701, 1715, 1708, 1713, + 1714, 1580, 1617, 1629, 0, 1632, 913, 918, 0, 934, + 0, 0, 0, 0, 0, 0, 0, 1211, 1626, 1650, + 1658, 0, 1653, 0, 0, 0, 1925, 0, 1880, 0, + 0, 1888, 1899, 1912, 0, 0, 1808, 0, 1810, 1811, + 0, 1815, 0, 1817, 0, 0, 1644, 0, 1674, 1465, + 1466, 1469, 1472, 1473, 1474, 1475, 1476, 1477, 0, 1481, + 1482, 1483, 1484, 1485, 1486, 1487, 1488, 1492, 1493, 1494, + 1495, 1496, 573, 548, 0, 0, 1138, 0, 0, 0, + 0, 1001, 991, 999, 176, 180, 0, 204, 201, 0, + 210, 0, 0, 0, 0, 1593, 0, 1917, 0, 2029, + 0, 0, 0, 0, 2034, 2035, 2036, 2037, 2038, 1545, + 1557, 1546, 1557, 77, 79, 81, 99, 1522, 106, 0, + 1321, 1322, 1349, 1462, 1463, 1464, 0, 1666, 1733, 1690, + 1700, 0, 1706, 0, 1707, 0, 1631, 868, 0, 927, + 0, 0, 1202, 1205, 1206, 0, 0, 0, 1652, 0, + -2, 1661, 0, 0, 2231, 2240, 2241, 1878, 1885, 0, + 1887, 1889, 1890, 1898, 1900, 1901, 0, 1913, 1914, 1915, + 1923, 1459, 1459, 1459, 1459, 1819, 1665, 1478, 2063, 2058, + 0, 2229, 1133, 1134, 1000, 0, 983, 167, 0, 0, + 199, 200, 202, 0, 211, 0, 213, 214, 0, 0, + 0, 2030, 2031, 2032, 2033, 1547, 1548, 108, 1323, 1641, + 0, 1643, 0, 0, 0, 0, 0, 0, 1215, 0, + 0, 1654, -2, 0, 1663, 0, 1879, 1888, 1902, 0, + 1903, 0, 0, 0, 1809, 1812, 1816, 1818, 0, 1132, + 0, 0, 1002, 1603, 0, 181, 0, 183, 185, 186, + 196, 197, 203, 212, 0, 0, 2043, 1308, 1324, 0, + 0, 1645, 0, 1703, 0, 1720, 1721, 0, 1717, 0, + 0, 1710, 0, 926, 0, 0, 0, 0, 1207, 0, + 1212, 1213, 0, 1208, 0, 1662, 2232, 1886, 1904, 1906, + 1907, 0, 0, 1905, 2064, 2229, 1135, 168, 169, 0, + 182, 0, 1598, 1918, 1325, 1642, 1639, 1702, 0, 0, + 1716, 0, 0, 1709, 0, 0, 0, 956, 0, 0, + 0, 0, 1214, 0, 1908, 1910, 1909, 0, 0, 0, + 184, 1704, 1705, 1722, 1723, 1718, 1719, 1711, 1712, 0, + 0, 0, 0, 0, 0, 1220, 1218, 1209, 1136, 170, + 171, 172, 0, 958, 957, 930, 0, 931, 1216, 0, + 1217, 0, 0, 0, 0, 0, 0, 0, 959, 0, + 1221, 1219, 928, 929, } var yyTok1 = [...]int{ @@ -14869,14 +14968,14 @@ var yyTok1 = [...]int{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 129, 3, 3, 3, 162, 152, 3, 96, 97, 159, 157, 183, 158, 182, 160, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 789, 786, - 139, 138, 140, 3, 790, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 795, 792, + 139, 138, 140, 3, 796, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 164, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 787, 151, 788, 165, + 3, 3, 3, 793, 151, 794, 165, } var yyTok2 = [...]int{ @@ -15011,7 +15110,8 @@ var yyTok3 = [...]int{ 58095, 770, 58096, 771, 58097, 772, 58098, 773, 58099, 774, 58100, 775, 58101, 776, 58102, 777, 58103, 778, 58104, 779, 58105, 780, 58106, 781, 58107, 782, 58108, 783, 58109, 784, - 58110, 785, 0, + 58110, 785, 58111, 786, 58112, 787, 58113, 788, 58114, 789, + 58115, 790, 58116, 791, 0, } var yyErrorMessages = [...]struct { @@ -15361,7 +15461,7 @@ yydefault: case 3: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:1177 +//line mysql_sql.y:1180 { if yyDollar[1].statementUnion() != nil { yylex.(*Lexer).AppendStmt(yyDollar[1].statementUnion()) @@ -15369,7 +15469,7 @@ yydefault: } case 4: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:1183 +//line mysql_sql.y:1186 { yylex.(*Lexer).AppendTopLevelSemicolon(yyDollar[2].pos) if yyDollar[3].statementUnion() != nil { @@ -15379,7 +15479,7 @@ yydefault: case 5: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1192 +//line mysql_sql.y:1195 { yyLOCAL = tree.NewCompoundStmt(yyDollar[2].statementsUnion()) } @@ -15387,7 +15487,7 @@ yydefault: case 6: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.Statement -//line mysql_sql.y:1198 +//line mysql_sql.y:1201 { yyLOCAL = []tree.Statement{yyDollar[1].statementUnion()} } @@ -15395,7 +15495,7 @@ yydefault: case 7: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.Statement -//line mysql_sql.y:1202 +//line mysql_sql.y:1205 { yyLOCAL = append(yyDollar[1].statementsUnion(), yyDollar[3].statementUnion()) } @@ -15403,7 +15503,7 @@ yydefault: case 17: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1217 +//line mysql_sql.y:1220 { yyLOCAL = yyDollar[1].statementUnion() } @@ -15411,7 +15511,7 @@ yydefault: case 18: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1221 +//line mysql_sql.y:1224 { yyLOCAL = tree.Statement(nil) } @@ -15419,7 +15519,7 @@ yydefault: case 19: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1227 +//line mysql_sql.y:1230 { yyLOCAL = yyDollar[1].statementUnion() } @@ -15427,7 +15527,7 @@ yydefault: case 20: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1231 +//line mysql_sql.y:1234 { yyLOCAL = yyDollar[1].statementUnion() } @@ -15435,7 +15535,7 @@ yydefault: case 22: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1236 +//line mysql_sql.y:1239 { yyLOCAL = yyDollar[1].statementUnion() } @@ -15443,23 +15543,23 @@ yydefault: case 23: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1240 +//line mysql_sql.y:1243 { yyLOCAL = tree.Statement(nil) } yyVAL.union = yyLOCAL - case 58: + case 60: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1280 +//line mysql_sql.y:1285 { yyLOCAL = yyDollar[1].selectUnion() } yyVAL.union = yyLOCAL - case 69: + case 71: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1296 +//line mysql_sql.y:1301 { var timestamp = yyDollar[2].str var isS3 = false @@ -15471,10 +15571,10 @@ yydefault: yyLOCAL = tree.NewBackupStart(timestamp, isS3, dir, parallelism, option, backuptype, backupts) } yyVAL.union = yyLOCAL - case 70: + case 72: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1307 +//line mysql_sql.y:1312 { var timestamp = yyDollar[2].str var isS3 = true @@ -15486,34 +15586,34 @@ yydefault: yyLOCAL = tree.NewBackupStart(timestamp, isS3, dir, parallelism, option, backuptype, backupts) } yyVAL.union = yyLOCAL - case 71: + case 73: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:1319 +//line mysql_sql.y:1324 { yyVAL.str = "" } - case 72: + case 74: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:1323 +//line mysql_sql.y:1328 { yyVAL.str = yyDollar[2].str } - case 73: + case 75: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:1328 +//line mysql_sql.y:1333 { yyVAL.str = "" } - case 74: + case 76: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:1332 +//line mysql_sql.y:1337 { yyVAL.str = yyDollar[2].str } - case 75: + case 77: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1338 +//line mysql_sql.y:1343 { yyLOCAL = &tree.CreateCDC{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15527,71 +15627,71 @@ yydefault: } } yyVAL.union = yyLOCAL - case 76: + case 78: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:1353 +//line mysql_sql.y:1358 { yyLOCAL = yyDollar[1].strsUnion() } yyVAL.union = yyLOCAL - case 77: + case 79: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:1357 +//line mysql_sql.y:1362 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].strsUnion()...) } yyVAL.union = yyLOCAL - case 78: + case 80: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:1361 +//line mysql_sql.y:1366 { yyLOCAL = []string{} } yyVAL.union = yyLOCAL - case 79: + case 81: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:1365 +//line mysql_sql.y:1370 { yyLOCAL = append(yyLOCAL, yyDollar[1].str) yyLOCAL = append(yyLOCAL, yyDollar[3].str) } yyVAL.union = yyLOCAL - case 80: + case 82: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1372 +//line mysql_sql.y:1377 { yyLOCAL = &tree.ShowCDC{ Option: yyDollar[3].allCDCOptionUnion(), } } yyVAL.union = yyLOCAL - case 81: + case 83: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1380 +//line mysql_sql.y:1385 { yyLOCAL = &tree.PauseCDC{ Option: yyDollar[3].allCDCOptionUnion(), } } yyVAL.union = yyLOCAL - case 82: + case 84: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1388 +//line mysql_sql.y:1393 { yyLOCAL = tree.NewDropCDC(yyDollar[4].allCDCOptionUnion(), yyDollar[3].boolValUnion(), yyDollar[5].boolValUnion()) } yyVAL.union = yyLOCAL - case 83: + case 85: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.AllOrNotCDC -//line mysql_sql.y:1393 +//line mysql_sql.y:1398 { yyLOCAL = &tree.AllOrNotCDC{ All: true, @@ -15599,26 +15699,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 84: + case 86: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.AllOrNotCDC -//line mysql_sql.y:1400 +//line mysql_sql.y:1405 { yyLOCAL = yyDollar[1].allCDCOptionUnion() } yyVAL.union = yyLOCAL - case 85: + case 87: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.AllOrNotCDC -//line mysql_sql.y:1406 +//line mysql_sql.y:1411 { yyLOCAL = yyDollar[1].allCDCOptionUnion() } yyVAL.union = yyLOCAL - case 86: + case 88: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.AllOrNotCDC -//line mysql_sql.y:1411 +//line mysql_sql.y:1416 { yyLOCAL = &tree.AllOrNotCDC{ All: false, @@ -15626,10 +15726,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 87: + case 89: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.AllOrNotCDC -//line mysql_sql.y:1420 +//line mysql_sql.y:1425 { yyLOCAL = &tree.AllOrNotCDC{ All: true, @@ -15637,10 +15737,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 88: + case 90: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.AllOrNotCDC -//line mysql_sql.y:1427 +//line mysql_sql.y:1432 { yyLOCAL = &tree.AllOrNotCDC{ All: false, @@ -15648,30 +15748,30 @@ yydefault: } } yyVAL.union = yyLOCAL - case 89: + case 91: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1436 +//line mysql_sql.y:1441 { yyLOCAL = &tree.ResumeCDC{ TaskName: tree.Identifier(yyDollar[4].cstrUnion().Compare()), } } yyVAL.union = yyLOCAL - case 90: + case 92: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1444 +//line mysql_sql.y:1449 { yyLOCAL = &tree.RestartCDC{ TaskName: tree.Identifier(yyDollar[4].cstrUnion().Compare()), } } yyVAL.union = yyLOCAL - case 91: + case 93: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1452 +//line mysql_sql.y:1457 { yyLOCAL = &tree.CreateSnapShot{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15680,10 +15780,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 92: + case 94: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1462 +//line mysql_sql.y:1467 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELCLUSTER, @@ -15694,10 +15794,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 93: + case 95: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1472 +//line mysql_sql.y:1477 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELACCOUNT, @@ -15708,10 +15808,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 94: + case 96: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1482 +//line mysql_sql.y:1487 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELACCOUNT, @@ -15722,10 +15822,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 95: + case 97: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1492 +//line mysql_sql.y:1497 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELDATABASE, @@ -15736,10 +15836,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 96: + case 98: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1502 +//line mysql_sql.y:1507 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELTABLE, @@ -15750,10 +15850,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 97: + case 99: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1512 +//line mysql_sql.y:1517 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELTABLE, @@ -15766,10 +15866,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 98: + case 100: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1524 +//line mysql_sql.y:1529 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELDATABASE, @@ -15782,10 +15882,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 99: + case 101: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.ObjectInfo -//line mysql_sql.y:1536 +//line mysql_sql.y:1541 { spLevel := tree.SnapshotLevelType{ Level: tree.SNAPSHOTLEVELACCOUNT, @@ -15797,10 +15897,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 100: + case 102: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1549 +//line mysql_sql.y:1554 { yyLOCAL = &tree.CreatePitr{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15812,10 +15912,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 101: + case 103: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1560 +//line mysql_sql.y:1565 { yyLOCAL = &tree.CreatePitr{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15827,10 +15927,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 102: + case 104: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1571 +//line mysql_sql.y:1576 { yyLOCAL = &tree.CreatePitr{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15843,10 +15943,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 103: + case 105: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1583 +//line mysql_sql.y:1588 { yyLOCAL = &tree.CreatePitr{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15859,10 +15959,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 104: + case 106: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1595 +//line mysql_sql.y:1600 { yyLOCAL = &tree.CreatePitr{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15876,10 +15976,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 105: + case 107: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1608 +//line mysql_sql.y:1613 { yyLOCAL = &tree.CreatePitr{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15891,10 +15991,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 106: + case 108: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1619 +//line mysql_sql.y:1624 { yyLOCAL = &tree.CreatePitr{ IfNotExists: yyDollar[3].ifNotExistsUnion(), @@ -15908,10 +16008,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 107: + case 109: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:1634 +//line mysql_sql.y:1639 { value, ok := signedIntegral(yylex, yyDollar[1].item) if !ok { @@ -15920,10 +16020,10 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 108: + case 110: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1643 +//line mysql_sql.y:1648 { var account tree.Identifier var database tree.Identifier @@ -15956,24 +16056,24 @@ yydefault: yyLOCAL = result } yyVAL.union = yyLOCAL - case 109: + case 111: yyDollar = yyS[yypt-6 : yypt+1] -//line mysql_sql.y:1675 +//line mysql_sql.y:1680 { yylex.Error(restoreSnapshotFromSyntaxHint) goto ret1 } - case 110: + case 112: yyDollar = yyS[yypt-8 : yypt+1] -//line mysql_sql.y:1680 +//line mysql_sql.y:1685 { yylex.Error(restoreSnapshotFromSyntaxHint) goto ret1 } - case 111: + case 113: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1685 +//line mysql_sql.y:1690 { var account tree.Identifier var database tree.Identifier @@ -16011,10 +16111,10 @@ yydefault: yyLOCAL = result } yyVAL.union = yyLOCAL - case 112: + case 114: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1722 +//line mysql_sql.y:1727 { yyLOCAL = &tree.RestoreSnapShot{ Level: tree.RESTORELEVELCLUSTER, @@ -16022,10 +16122,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 113: + case 115: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1729 +//line mysql_sql.y:1734 { result := &tree.RestoreSnapShot{ Level: tree.RESTORELEVELACCOUNT, @@ -16040,25 +16140,25 @@ yydefault: yyLOCAL = result } yyVAL.union = yyLOCAL - case 114: + case 116: yyDollar = yyS[yypt-8 : yypt+1] -//line mysql_sql.y:1743 +//line mysql_sql.y:1748 { yylex.Error(restoreSnapshotFromSyntaxHint) goto ret1 } - case 115: + case 117: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:1750 +//line mysql_sql.y:1755 { yyLOCAL = tree.IdentifierList{tree.Identifier(yyDollar[1].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 116: + case 118: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:1754 +//line mysql_sql.y:1759 { yyLOCAL = tree.IdentifierList{ tree.Identifier(yyDollar[1].cstrUnion().Compare()), @@ -16066,10 +16166,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 117: + case 119: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:1763 +//line mysql_sql.y:1768 { yyLOCAL = tree.IdentifierList{ tree.Identifier(yyDollar[1].cstrUnion().Compare()), @@ -16077,10 +16177,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 118: + case 120: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:1770 +//line mysql_sql.y:1775 { yyLOCAL = tree.IdentifierList{ tree.Identifier(yyDollar[1].cstrUnion().Compare()), @@ -16089,46 +16189,46 @@ yydefault: } } yyVAL.union = yyLOCAL - case 119: + case 121: yyDollar = yyS[yypt-5 : yypt+1] -//line mysql_sql.y:1780 +//line mysql_sql.y:1785 { yyVAL.str = yyDollar[4].cstrUnion().Compare() } - case 120: + case 122: yyDollar = yyS[yypt-5 : yypt+1] -//line mysql_sql.y:1784 +//line mysql_sql.y:1789 { yyVAL.str = strings.ToLower(yyDollar[4].str) } - case 121: + case 123: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:1790 +//line mysql_sql.y:1795 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 122: + case 124: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:1794 +//line mysql_sql.y:1799 { yyVAL.str = yyDollar[1].str } - case 123: + case 125: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:1799 +//line mysql_sql.y:1804 { yyVAL.str = "" } - case 124: + case 126: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:1803 +//line mysql_sql.y:1808 { yyVAL.str = yyDollar[3].cstrUnion().Compare() } - case 125: + case 127: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1809 +//line mysql_sql.y:1814 { yyLOCAL = &tree.RestorePitr{ Level: tree.RESTORELEVELACCOUNT, @@ -16137,10 +16237,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 126: + case 128: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1817 +//line mysql_sql.y:1822 { yyLOCAL = &tree.RestorePitr{ Level: tree.RESTORELEVELDATABASE, @@ -16150,10 +16250,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 127: + case 129: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1826 +//line mysql_sql.y:1831 { yyLOCAL = &tree.RestorePitr{ Level: tree.RESTORELEVELDATABASE, @@ -16164,10 +16264,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 128: + case 130: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1836 +//line mysql_sql.y:1841 { yyLOCAL = &tree.RestorePitr{ Level: tree.RESTORELEVELTABLE, @@ -16178,10 +16278,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 129: + case 131: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1846 +//line mysql_sql.y:1851 { yyLOCAL = &tree.RestorePitr{ Level: tree.RESTORELEVELTABLE, @@ -16193,10 +16293,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 130: + case 132: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1857 +//line mysql_sql.y:1862 { yyLOCAL = &tree.RestorePitr{ Level: tree.RESTORELEVELACCOUNT, @@ -16207,10 +16307,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 131: + case 133: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1867 +//line mysql_sql.y:1872 { yyLOCAL = &tree.RestorePitr{ Level: tree.RESTORELEVELCLUSTER, @@ -16219,10 +16319,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 132: + case 134: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1877 +//line mysql_sql.y:1882 { var connectionId uint64 switch v := yyDollar[3].item.(type) { @@ -16242,20 +16342,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 133: + case 135: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.KillOption -//line mysql_sql.y:1897 +//line mysql_sql.y:1902 { yyLOCAL = tree.KillOption{ Exist: false, } } yyVAL.union = yyLOCAL - case 134: + case 136: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.KillOption -//line mysql_sql.y:1903 +//line mysql_sql.y:1908 { yyLOCAL = tree.KillOption{ Exist: true, @@ -16263,10 +16363,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 135: + case 137: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.KillOption -//line mysql_sql.y:1910 +//line mysql_sql.y:1915 { yyLOCAL = tree.KillOption{ Exist: true, @@ -16274,20 +16374,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 136: + case 138: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.StatementOption -//line mysql_sql.y:1918 +//line mysql_sql.y:1923 { yyLOCAL = tree.StatementOption{ Exist: false, } } yyVAL.union = yyLOCAL - case 137: + case 139: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.StatementOption -//line mysql_sql.y:1924 +//line mysql_sql.y:1929 { yyLOCAL = tree.StatementOption{ Exist: true, @@ -16295,10 +16395,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 138: + case 140: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1933 +//line mysql_sql.y:1938 { yyLOCAL = &tree.CallStmt{ Name: yyDollar[2].procNameUnion(), @@ -16306,30 +16406,30 @@ yydefault: } } yyVAL.union = yyLOCAL - case 139: + case 141: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1942 +//line mysql_sql.y:1947 { yyLOCAL = &tree.LeaveStmt{ Name: tree.Identifier(yyDollar[2].cstrUnion().Compare()), } } yyVAL.union = yyLOCAL - case 140: + case 142: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1950 +//line mysql_sql.y:1955 { yyLOCAL = &tree.IterateStmt{ Name: tree.Identifier(yyDollar[2].cstrUnion().Compare()), } } yyVAL.union = yyLOCAL - case 141: + case 143: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1958 +//line mysql_sql.y:1963 { yyLOCAL = &tree.WhileStmt{ Name: "", @@ -16338,10 +16438,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 142: + case 144: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1966 +//line mysql_sql.y:1971 { yyLOCAL = &tree.WhileStmt{ Name: tree.Identifier(yyDollar[1].cstrUnion().Compare()), @@ -16350,10 +16450,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 143: + case 145: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1976 +//line mysql_sql.y:1981 { yyLOCAL = &tree.RepeatStmt{ Name: "", @@ -16362,10 +16462,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 144: + case 146: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1984 +//line mysql_sql.y:1989 { yyLOCAL = &tree.RepeatStmt{ Name: tree.Identifier(yyDollar[1].cstrUnion().Compare()), @@ -16374,10 +16474,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 145: + case 147: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:1994 +//line mysql_sql.y:1999 { yyLOCAL = &tree.LoopStmt{ Name: "", @@ -16385,10 +16485,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 146: + case 148: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2001 +//line mysql_sql.y:2006 { yyLOCAL = &tree.LoopStmt{ Name: tree.Identifier(yyDollar[1].cstrUnion().Compare()), @@ -16396,10 +16496,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 147: + case 149: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2010 +//line mysql_sql.y:2015 { yyLOCAL = &tree.IfStmt{ Cond: yyDollar[2].exprUnion(), @@ -16409,42 +16509,42 @@ yydefault: } } yyVAL.union = yyLOCAL - case 148: + case 150: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.ElseIfStmt -//line mysql_sql.y:2020 +//line mysql_sql.y:2025 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 149: + case 151: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.ElseIfStmt -//line mysql_sql.y:2024 +//line mysql_sql.y:2029 { yyLOCAL = yyDollar[1].elseIfClauseListUnion() } yyVAL.union = yyLOCAL - case 150: + case 152: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.ElseIfStmt -//line mysql_sql.y:2030 +//line mysql_sql.y:2035 { yyLOCAL = []*tree.ElseIfStmt{yyDollar[1].elseIfClauseUnion()} } yyVAL.union = yyLOCAL - case 151: + case 153: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.ElseIfStmt -//line mysql_sql.y:2034 +//line mysql_sql.y:2039 { yyLOCAL = append(yyDollar[1].elseIfClauseListUnion(), yyDollar[2].elseIfClauseUnion()) } yyVAL.union = yyLOCAL - case 152: + case 154: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.ElseIfStmt -//line mysql_sql.y:2040 +//line mysql_sql.y:2045 { yyLOCAL = &tree.ElseIfStmt{ Cond: yyDollar[2].exprUnion(), @@ -16452,10 +16552,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 153: + case 155: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2049 +//line mysql_sql.y:2054 { yyLOCAL = &tree.CaseStmt{ Expr: yyDollar[2].exprUnion(), @@ -16464,26 +16564,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 154: + case 156: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.WhenStmt -//line mysql_sql.y:2059 +//line mysql_sql.y:2064 { yyLOCAL = []*tree.WhenStmt{yyDollar[1].whenClause2Union()} } yyVAL.union = yyLOCAL - case 155: + case 157: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.WhenStmt -//line mysql_sql.y:2063 +//line mysql_sql.y:2068 { yyLOCAL = append(yyDollar[1].whenClauseList2Union(), yyDollar[2].whenClause2Union()) } yyVAL.union = yyLOCAL - case 156: + case 158: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.WhenStmt -//line mysql_sql.y:2069 +//line mysql_sql.y:2074 { yyLOCAL = &tree.WhenStmt{ Cond: yyDollar[2].exprUnion(), @@ -16491,26 +16591,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 157: + case 159: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []tree.Statement -//line mysql_sql.y:2078 +//line mysql_sql.y:2083 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 158: + case 160: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.Statement -//line mysql_sql.y:2082 +//line mysql_sql.y:2087 { yyLOCAL = yyDollar[2].statementsUnion() } yyVAL.union = yyLOCAL - case 159: + case 161: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2088 +//line mysql_sql.y:2093 { ep := &tree.ExportParam{ Outfile: true, @@ -16527,10 +16627,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 160: + case 162: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2106 +//line mysql_sql.y:2111 { yyLOCAL = &tree.Load{ Local: yyDollar[3].boolValUnion(), @@ -16543,76 +16643,76 @@ yydefault: yyLOCAL.(*tree.Load).Param.Strict = yyDollar[11].unsignedOptUnion() } yyVAL.union = yyLOCAL - case 161: + case 163: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2120 +//line mysql_sql.y:2125 { yyLOCAL = &tree.DumpTable{Table: yyDollar[3].tableNameUnion(), Path: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 162: + case 164: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2124 +//line mysql_sql.y:2129 { yyLOCAL = &tree.DumpTable{Table: yyDollar[3].tableNameUnion(), Path: yyDollar[5].str, MetadataOnly: true} } yyVAL.union = yyLOCAL - case 163: + case 165: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2130 +//line mysql_sql.y:2135 { yyLOCAL = &tree.LoadTable{Table: yyDollar[3].tableNameUnion(), Path: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 164: + case 166: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2136 +//line mysql_sql.y:2141 { yyLOCAL = &tree.LoadExtension{ Name: tree.Identifier(yyDollar[2].str), } } yyVAL.union = yyLOCAL - case 165: + case 167: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:2143 +//line mysql_sql.y:2148 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 166: + case 168: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:2147 +//line mysql_sql.y:2152 { yyLOCAL = yyDollar[2].updateExprsUnion() } yyVAL.union = yyLOCAL - case 167: + case 169: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:2153 +//line mysql_sql.y:2158 { yyLOCAL = tree.UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL - case 168: + case 170: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:2157 +//line mysql_sql.y:2162 { yyLOCAL = append(yyDollar[1].updateExprsUnion(), yyDollar[3].updateExprUnion()) } yyVAL.union = yyLOCAL - case 169: + case 171: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UpdateExpr -//line mysql_sql.y:2163 +//line mysql_sql.y:2168 { yyLOCAL = &tree.UpdateExpr{ Names: []*tree.UnresolvedName{yyDollar[1].unresolvedNameUnion()}, @@ -16620,10 +16720,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 170: + case 172: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UpdateExpr -//line mysql_sql.y:2170 +//line mysql_sql.y:2175 { yyLOCAL = &tree.UpdateExpr{ Names: []*tree.UnresolvedName{yyDollar[1].unresolvedNameUnion()}, @@ -16631,18 +16731,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 171: + case 173: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:2178 +//line mysql_sql.y:2183 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 172: + case 174: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:2182 +//line mysql_sql.y:2187 { str := strings.ToLower(yyDollar[2].str) if str == "true" { @@ -16655,18 +16755,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 173: + case 175: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:2194 +//line mysql_sql.y:2199 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 174: + case 176: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:2198 +//line mysql_sql.y:2203 { str := strings.ToLower(yyDollar[2].str) if str == "true" { @@ -16679,61 +16779,61 @@ yydefault: } } yyVAL.union = yyLOCAL - case 175: + case 177: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:2212 +//line mysql_sql.y:2217 { yyLOCAL = tree.NewUnresolvedName(yyDollar[1].cstrUnion()) } yyVAL.union = yyLOCAL - case 176: + case 178: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:2216 +//line mysql_sql.y:2221 { tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(tblNameCStr, yyDollar[3].cstrUnion()) } yyVAL.union = yyLOCAL - case 177: + case 179: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:2221 +//line mysql_sql.y:2226 { dbNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[3].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(dbNameCStr, tblNameCStr, yyDollar[5].cstrUnion()) } yyVAL.union = yyLOCAL - case 178: + case 180: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []tree.LoadColumn -//line mysql_sql.y:2228 +//line mysql_sql.y:2233 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 179: + case 181: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.LoadColumn -//line mysql_sql.y:2232 +//line mysql_sql.y:2237 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 180: + case 182: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.LoadColumn -//line mysql_sql.y:2236 +//line mysql_sql.y:2241 { yyLOCAL = yyDollar[2].loadColumnsUnion() } yyVAL.union = yyLOCAL - case 181: + case 183: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.LoadColumn -//line mysql_sql.y:2242 +//line mysql_sql.y:2247 { switch yyDollar[1].loadColumnUnion().(type) { case *tree.UnresolvedName: @@ -16743,10 +16843,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 182: + case 184: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.LoadColumn -//line mysql_sql.y:2251 +//line mysql_sql.y:2256 { switch yyDollar[3].loadColumnUnion().(type) { case *tree.UnresolvedName: @@ -16756,74 +16856,74 @@ yydefault: } } yyVAL.union = yyLOCAL - case 183: + case 185: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.LoadColumn -//line mysql_sql.y:2262 +//line mysql_sql.y:2267 { yyLOCAL = yyDollar[1].unresolvedNameUnion() } yyVAL.union = yyLOCAL - case 184: + case 186: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.LoadColumn -//line mysql_sql.y:2266 +//line mysql_sql.y:2271 { yyLOCAL = yyDollar[1].varExprUnion() } yyVAL.union = yyLOCAL - case 185: + case 187: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.VarExpr -//line mysql_sql.y:2272 +//line mysql_sql.y:2277 { yyLOCAL = []*tree.VarExpr{yyDollar[1].varExprUnion()} } yyVAL.union = yyLOCAL - case 186: + case 188: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.VarExpr -//line mysql_sql.y:2276 +//line mysql_sql.y:2281 { yyLOCAL = append(yyDollar[1].varExprsUnion(), yyDollar[3].varExprUnion()) } yyVAL.union = yyLOCAL - case 187: + case 189: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.VarExpr -//line mysql_sql.y:2282 +//line mysql_sql.y:2287 { yyLOCAL = []*tree.VarExpr{yyDollar[1].varExprUnion()} } yyVAL.union = yyLOCAL - case 188: + case 190: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.VarExpr -//line mysql_sql.y:2286 +//line mysql_sql.y:2291 { yyLOCAL = append(yyDollar[1].varExprsUnion(), yyDollar[3].varExprUnion()) } yyVAL.union = yyLOCAL - case 189: + case 191: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.VarExpr -//line mysql_sql.y:2292 +//line mysql_sql.y:2297 { yyLOCAL = yyDollar[1].varExprUnion() } yyVAL.union = yyLOCAL - case 190: + case 192: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.VarExpr -//line mysql_sql.y:2296 +//line mysql_sql.y:2301 { yyLOCAL = yyDollar[1].varExprUnion() } yyVAL.union = yyLOCAL - case 191: + case 193: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.VarExpr -//line mysql_sql.y:2302 +//line mysql_sql.y:2307 { v := strings.ToLower(yyDollar[1].str) var isGlobal bool @@ -16842,10 +16942,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 192: + case 194: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.VarExpr -//line mysql_sql.y:2322 +//line mysql_sql.y:2327 { // vs := strings.Split($1, ".") // var r string @@ -16864,18 +16964,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 193: + case 195: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:2341 +//line mysql_sql.y:2346 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 194: + case 196: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:2345 +//line mysql_sql.y:2350 { value, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -16884,10 +16984,10 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 195: + case 197: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:2351 +//line mysql_sql.y:2356 { value, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -16896,18 +16996,18 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 196: + case 198: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Lines -//line mysql_sql.y:2358 +//line mysql_sql.y:2363 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 197: + case 199: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Lines -//line mysql_sql.y:2362 +//line mysql_sql.y:2367 { yyLOCAL = &tree.Lines{ StartingBy: yyDollar[2].str, @@ -16917,10 +17017,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 198: + case 200: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Lines -//line mysql_sql.y:2371 +//line mysql_sql.y:2376 { yyLOCAL = &tree.Lines{ StartingBy: yyDollar[3].str, @@ -16930,42 +17030,42 @@ yydefault: } } yyVAL.union = yyLOCAL - case 199: + case 201: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:2381 +//line mysql_sql.y:2386 { yyVAL.str = "" } - case 201: + case 203: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:2388 +//line mysql_sql.y:2393 { yyVAL.str = yyDollar[3].str } - case 202: + case 204: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:2393 +//line mysql_sql.y:2398 { yyVAL.str = "\n" } - case 204: + case 206: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:2400 +//line mysql_sql.y:2405 { yyVAL.str = yyDollar[3].str } - case 205: + case 207: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:2405 +//line mysql_sql.y:2410 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 206: + case 208: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:2409 +//line mysql_sql.y:2414 { res := &tree.Fields{ Terminated: &tree.Terminated{ @@ -16992,26 +17092,26 @@ yydefault: yyLOCAL = res } yyVAL.union = yyLOCAL - case 207: + case 209: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.Fields -//line mysql_sql.y:2437 +//line mysql_sql.y:2442 { yyLOCAL = []*tree.Fields{yyDollar[1].fieldsUnion()} } yyVAL.union = yyLOCAL - case 208: + case 210: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.Fields -//line mysql_sql.y:2441 +//line mysql_sql.y:2446 { yyLOCAL = append(yyDollar[1].fieldsListUnion(), yyDollar[2].fieldsUnion()) } yyVAL.union = yyLOCAL - case 209: + case 211: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:2447 +//line mysql_sql.y:2452 { yyLOCAL = &tree.Fields{ Terminated: &tree.Terminated{ @@ -17020,10 +17120,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 210: + case 212: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:2455 +//line mysql_sql.y:2460 { str := yyDollar[4].str if str != "\\" && len(str) > 1 { @@ -17044,10 +17144,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 211: + case 213: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:2475 +//line mysql_sql.y:2480 { str := yyDollar[3].str if str != "\\" && len(str) > 1 { @@ -17067,10 +17167,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 212: + case 214: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:2494 +//line mysql_sql.y:2499 { str := yyDollar[3].str if str != "\\" && len(str) > 1 { @@ -17090,50 +17190,50 @@ yydefault: } } yyVAL.union = yyLOCAL - case 214: + case 216: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.DuplicateKey -//line mysql_sql.y:2519 +//line mysql_sql.y:2524 { yyLOCAL = &tree.DuplicateKeyError{} } yyVAL.union = yyLOCAL - case 215: + case 217: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.DuplicateKey -//line mysql_sql.y:2523 +//line mysql_sql.y:2528 { yyLOCAL = &tree.DuplicateKeyIgnore{} } yyVAL.union = yyLOCAL - case 216: + case 218: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.DuplicateKey -//line mysql_sql.y:2527 +//line mysql_sql.y:2532 { yyLOCAL = &tree.DuplicateKeyReplace{} } yyVAL.union = yyLOCAL - case 217: + case 219: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:2532 +//line mysql_sql.y:2537 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 218: + case 220: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:2536 +//line mysql_sql.y:2541 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 219: + case 221: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2542 +//line mysql_sql.y:2547 { yyLOCAL = &tree.Grant{ Typ: tree.GrantTypePrivilege, @@ -17147,10 +17247,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 220: + case 222: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2555 +//line mysql_sql.y:2560 { yyLOCAL = &tree.Grant{ Typ: tree.GrantTypeRole, @@ -17162,10 +17262,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 221: + case 223: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2566 +//line mysql_sql.y:2571 { yyLOCAL = &tree.Grant{ Typ: tree.GrantTypeProxy, @@ -17178,26 +17278,26 @@ yydefault: } yyVAL.union = yyLOCAL - case 222: + case 224: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:2579 +//line mysql_sql.y:2584 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 223: + case 225: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:2583 +//line mysql_sql.y:2588 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 224: + case 226: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2593 +//line mysql_sql.y:2598 { yyLOCAL = &tree.Revoke{ Typ: tree.RevokeTypePrivilege, @@ -17211,10 +17311,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 225: + case 227: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2606 +//line mysql_sql.y:2611 { yyLOCAL = &tree.Revoke{ Typ: tree.RevokeTypeRole, @@ -17226,30 +17326,30 @@ yydefault: } } yyVAL.union = yyLOCAL - case 226: + case 228: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.PrivilegeLevel -//line mysql_sql.y:2619 +//line mysql_sql.y:2624 { yyLOCAL = &tree.PrivilegeLevel{ Level: tree.PRIVILEGE_LEVEL_TYPE_STAR, } } yyVAL.union = yyLOCAL - case 227: + case 229: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.PrivilegeLevel -//line mysql_sql.y:2625 +//line mysql_sql.y:2630 { yyLOCAL = &tree.PrivilegeLevel{ Level: tree.PRIVILEGE_LEVEL_TYPE_STAR_STAR, } } yyVAL.union = yyLOCAL - case 228: + case 230: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.PrivilegeLevel -//line mysql_sql.y:2631 +//line mysql_sql.y:2636 { tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) yyLOCAL = &tree.PrivilegeLevel{ @@ -17258,10 +17358,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 229: + case 231: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.PrivilegeLevel -//line mysql_sql.y:2639 +//line mysql_sql.y:2644 { dbName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[3].cstrUnion().Origin()) @@ -17272,10 +17372,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 230: + case 232: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.PrivilegeLevel -//line mysql_sql.y:2649 +//line mysql_sql.y:2654 { tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) yyLOCAL = &tree.PrivilegeLevel{ @@ -17284,74 +17384,74 @@ yydefault: } } yyVAL.union = yyLOCAL - case 231: + case 233: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectType -//line mysql_sql.y:2659 +//line mysql_sql.y:2664 { yyLOCAL = tree.OBJECT_TYPE_TABLE } yyVAL.union = yyLOCAL - case 232: + case 234: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectType -//line mysql_sql.y:2663 +//line mysql_sql.y:2668 { yyLOCAL = tree.OBJECT_TYPE_DATABASE } yyVAL.union = yyLOCAL - case 233: + case 235: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectType -//line mysql_sql.y:2667 +//line mysql_sql.y:2672 { yyLOCAL = tree.OBJECT_TYPE_FUNCTION } yyVAL.union = yyLOCAL - case 234: + case 236: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectType -//line mysql_sql.y:2671 +//line mysql_sql.y:2676 { yyLOCAL = tree.OBJECT_TYPE_PROCEDURE } yyVAL.union = yyLOCAL - case 235: + case 237: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectType -//line mysql_sql.y:2675 +//line mysql_sql.y:2680 { yyLOCAL = tree.OBJECT_TYPE_VIEW } yyVAL.union = yyLOCAL - case 236: + case 238: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ObjectType -//line mysql_sql.y:2679 +//line mysql_sql.y:2684 { yyLOCAL = tree.OBJECT_TYPE_ACCOUNT } yyVAL.union = yyLOCAL - case 237: + case 239: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.Privilege -//line mysql_sql.y:2685 +//line mysql_sql.y:2690 { yyLOCAL = []*tree.Privilege{yyDollar[1].privilegeUnion()} } yyVAL.union = yyLOCAL - case 238: + case 240: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.Privilege -//line mysql_sql.y:2689 +//line mysql_sql.y:2694 { yyLOCAL = append(yyDollar[1].privilegesUnion(), yyDollar[3].privilegeUnion()) } yyVAL.union = yyLOCAL - case 239: + case 241: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Privilege -//line mysql_sql.y:2695 +//line mysql_sql.y:2700 { yyLOCAL = &tree.Privilege{ Type: yyDollar[1].privilegeTypeUnion(), @@ -17359,10 +17459,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 240: + case 242: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Privilege -//line mysql_sql.y:2702 +//line mysql_sql.y:2707 { yyLOCAL = &tree.Privilege{ Type: yyDollar[1].privilegeTypeUnion(), @@ -17370,434 +17470,434 @@ yydefault: } } yyVAL.union = yyLOCAL - case 241: + case 243: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.UnresolvedName -//line mysql_sql.y:2711 +//line mysql_sql.y:2716 { yyLOCAL = []*tree.UnresolvedName{yyDollar[1].unresolvedNameUnion()} } yyVAL.union = yyLOCAL - case 242: + case 244: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.UnresolvedName -//line mysql_sql.y:2715 +//line mysql_sql.y:2720 { yyLOCAL = append(yyDollar[1].unresolveNamesUnion(), yyDollar[3].unresolvedNameUnion()) } yyVAL.union = yyLOCAL - case 243: + case 245: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2721 +//line mysql_sql.y:2726 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALL } yyVAL.union = yyLOCAL - case 244: + case 246: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2725 +//line mysql_sql.y:2730 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_ACCOUNT } yyVAL.union = yyLOCAL - case 245: + case 247: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2729 +//line mysql_sql.y:2734 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_DROP_ACCOUNT } yyVAL.union = yyLOCAL - case 246: + case 248: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2733 +//line mysql_sql.y:2738 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALTER_ACCOUNT } yyVAL.union = yyLOCAL - case 247: + case 249: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2737 +//line mysql_sql.y:2742 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_UPGRADE_ACCOUNT } yyVAL.union = yyLOCAL - case 248: + case 250: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2741 +//line mysql_sql.y:2746 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALL } yyVAL.union = yyLOCAL - case 249: + case 251: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2745 +//line mysql_sql.y:2750 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALTER_TABLE } yyVAL.union = yyLOCAL - case 250: + case 252: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2749 +//line mysql_sql.y:2754 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALTER_VIEW } yyVAL.union = yyLOCAL - case 251: + case 253: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2753 +//line mysql_sql.y:2758 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE } yyVAL.union = yyLOCAL - case 252: + case 254: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2757 +//line mysql_sql.y:2762 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_USER } yyVAL.union = yyLOCAL - case 253: + case 255: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2761 +//line mysql_sql.y:2766 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_DROP_USER } yyVAL.union = yyLOCAL - case 254: + case 256: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2765 +//line mysql_sql.y:2770 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALTER_USER } yyVAL.union = yyLOCAL - case 255: + case 257: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2769 +//line mysql_sql.y:2774 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_TABLESPACE } yyVAL.union = yyLOCAL - case 256: + case 258: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2773 +//line mysql_sql.y:2778 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_TRIGGER } yyVAL.union = yyLOCAL - case 257: + case 259: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2777 +//line mysql_sql.y:2782 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_DELETE } yyVAL.union = yyLOCAL - case 258: + case 260: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2781 +//line mysql_sql.y:2786 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_DROP_TABLE } yyVAL.union = yyLOCAL - case 259: + case 261: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2785 +//line mysql_sql.y:2790 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_DROP_VIEW } yyVAL.union = yyLOCAL - case 260: + case 262: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2789 +//line mysql_sql.y:2794 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_EXECUTE } yyVAL.union = yyLOCAL - case 261: + case 263: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2793 +//line mysql_sql.y:2798 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_INDEX } yyVAL.union = yyLOCAL - case 262: + case 264: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2797 +//line mysql_sql.y:2802 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_INSERT } yyVAL.union = yyLOCAL - case 263: + case 265: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2801 +//line mysql_sql.y:2806 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_SELECT } yyVAL.union = yyLOCAL - case 264: + case 266: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2805 +//line mysql_sql.y:2810 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_SUPER } yyVAL.union = yyLOCAL - case 265: + case 267: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2809 +//line mysql_sql.y:2814 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_DATABASE } yyVAL.union = yyLOCAL - case 266: + case 268: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2813 +//line mysql_sql.y:2818 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_DROP_DATABASE } yyVAL.union = yyLOCAL - case 267: + case 269: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2817 +//line mysql_sql.y:2822 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_SHOW_DATABASES } yyVAL.union = yyLOCAL - case 268: + case 270: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2821 +//line mysql_sql.y:2826 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CONNECT } yyVAL.union = yyLOCAL - case 269: + case 271: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2825 +//line mysql_sql.y:2830 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_MANAGE_GRANTS } yyVAL.union = yyLOCAL - case 270: + case 272: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2829 +//line mysql_sql.y:2834 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_OWNERSHIP } yyVAL.union = yyLOCAL - case 271: + case 273: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2833 +//line mysql_sql.y:2838 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_SHOW_TABLES } yyVAL.union = yyLOCAL - case 272: + case 274: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2837 +//line mysql_sql.y:2842 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_TABLE } yyVAL.union = yyLOCAL - case 273: + case 275: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2841 +//line mysql_sql.y:2846 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_UPDATE } yyVAL.union = yyLOCAL - case 274: + case 276: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2845 +//line mysql_sql.y:2850 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_GRANT_OPTION } yyVAL.union = yyLOCAL - case 275: + case 277: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2849 +//line mysql_sql.y:2854 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_REFERENCES } yyVAL.union = yyLOCAL - case 276: + case 278: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2853 +//line mysql_sql.y:2858 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_REFERENCE } yyVAL.union = yyLOCAL - case 277: + case 279: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2857 +//line mysql_sql.y:2862 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_REPLICATION_SLAVE } yyVAL.union = yyLOCAL - case 278: + case 280: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2861 +//line mysql_sql.y:2866 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_REPLICATION_CLIENT } yyVAL.union = yyLOCAL - case 279: + case 281: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2865 +//line mysql_sql.y:2870 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_USAGE } yyVAL.union = yyLOCAL - case 280: + case 282: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2869 +//line mysql_sql.y:2874 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_RELOAD } yyVAL.union = yyLOCAL - case 281: + case 283: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2873 +//line mysql_sql.y:2878 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_FILE } yyVAL.union = yyLOCAL - case 282: + case 284: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2877 +//line mysql_sql.y:2882 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_TEMPORARY_TABLES } yyVAL.union = yyLOCAL - case 283: + case 285: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2881 +//line mysql_sql.y:2886 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_LOCK_TABLES } yyVAL.union = yyLOCAL - case 284: + case 286: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2885 +//line mysql_sql.y:2890 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_VIEW } yyVAL.union = yyLOCAL - case 285: + case 287: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2889 +//line mysql_sql.y:2894 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_SHOW_VIEW } yyVAL.union = yyLOCAL - case 286: + case 288: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2893 +//line mysql_sql.y:2898 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_ROLE } yyVAL.union = yyLOCAL - case 287: + case 289: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2897 +//line mysql_sql.y:2902 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_DROP_ROLE } yyVAL.union = yyLOCAL - case 288: + case 290: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2901 +//line mysql_sql.y:2906 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALTER_ROLE } yyVAL.union = yyLOCAL - case 289: + case 291: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2905 +//line mysql_sql.y:2910 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_CREATE_ROUTINE } yyVAL.union = yyLOCAL - case 290: + case 292: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2909 +//line mysql_sql.y:2914 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_ALTER_ROUTINE } yyVAL.union = yyLOCAL - case 291: + case 293: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2913 +//line mysql_sql.y:2918 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_EVENT } yyVAL.union = yyLOCAL - case 292: + case 294: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2917 +//line mysql_sql.y:2922 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_SHUTDOWN } yyVAL.union = yyLOCAL - case 293: + case 295: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.PrivilegeType -//line mysql_sql.y:2921 +//line mysql_sql.y:2926 { yyLOCAL = tree.PRIVILEGE_TYPE_STATIC_TRUNCATE } yyVAL.union = yyLOCAL - case 301: + case 303: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2936 +//line mysql_sql.y:2941 { yyLOCAL = &tree.SetLogserviceSettings{ Name: yyDollar[4].str, @@ -17805,10 +17905,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 302: + case 304: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2945 +//line mysql_sql.y:2950 { yyLOCAL = &tree.SetTransaction{ Scope: tree.TransactionScopeNext, @@ -17816,10 +17916,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 303: + case 305: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2952 +//line mysql_sql.y:2957 { yyLOCAL = &tree.SetTransaction{ Scope: tree.TransactionScopeGlobal, @@ -17827,10 +17927,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 304: + case 306: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2959 +//line mysql_sql.y:2964 { yyLOCAL = &tree.SetTransaction{ Scope: tree.TransactionScopeSession, @@ -17838,10 +17938,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 305: + case 307: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:2968 +//line mysql_sql.y:2973 { var connID uint32 switch v := yyDollar[5].item.(type) { @@ -17858,26 +17958,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 306: + case 308: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.TransactionCharacteristic -//line mysql_sql.y:2986 +//line mysql_sql.y:2991 { yyLOCAL = []*tree.TransactionCharacteristic{yyDollar[1].transactionCharacteristicUnion()} } yyVAL.union = yyLOCAL - case 307: + case 309: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.TransactionCharacteristic -//line mysql_sql.y:2990 +//line mysql_sql.y:2995 { yyLOCAL = append(yyDollar[1].transactionCharacteristicListUnion(), yyDollar[3].transactionCharacteristicUnion()) } yyVAL.union = yyLOCAL - case 308: + case 310: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.TransactionCharacteristic -//line mysql_sql.y:2996 +//line mysql_sql.y:3001 { yyLOCAL = &tree.TransactionCharacteristic{ IsLevel: true, @@ -17885,68 +17985,68 @@ yydefault: } } yyVAL.union = yyLOCAL - case 309: + case 311: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.TransactionCharacteristic -//line mysql_sql.y:3003 +//line mysql_sql.y:3008 { yyLOCAL = &tree.TransactionCharacteristic{ Access: yyDollar[1].accessModeUnion(), } } yyVAL.union = yyLOCAL - case 310: + case 312: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IsolationLevelType -//line mysql_sql.y:3011 +//line mysql_sql.y:3016 { yyLOCAL = tree.ISOLATION_LEVEL_REPEATABLE_READ } yyVAL.union = yyLOCAL - case 311: + case 313: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IsolationLevelType -//line mysql_sql.y:3015 +//line mysql_sql.y:3020 { yyLOCAL = tree.ISOLATION_LEVEL_READ_COMMITTED } yyVAL.union = yyLOCAL - case 312: + case 314: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IsolationLevelType -//line mysql_sql.y:3019 +//line mysql_sql.y:3024 { yyLOCAL = tree.ISOLATION_LEVEL_READ_UNCOMMITTED } yyVAL.union = yyLOCAL - case 313: + case 315: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IsolationLevelType -//line mysql_sql.y:3023 +//line mysql_sql.y:3028 { yyLOCAL = tree.ISOLATION_LEVEL_SERIALIZABLE } yyVAL.union = yyLOCAL - case 314: + case 316: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AccessModeType -//line mysql_sql.y:3029 +//line mysql_sql.y:3034 { yyLOCAL = tree.ACCESS_MODE_READ_WRITE } yyVAL.union = yyLOCAL - case 315: + case 317: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AccessModeType -//line mysql_sql.y:3033 +//line mysql_sql.y:3038 { yyLOCAL = tree.ACCESS_MODE_READ_ONLY } yyVAL.union = yyLOCAL - case 316: + case 318: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3039 +//line mysql_sql.y:3044 { yyLOCAL = &tree.SetRole{ SecondaryRole: false, @@ -17954,10 +18054,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 317: + case 319: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3046 +//line mysql_sql.y:3051 { yyLOCAL = &tree.SetRole{ SecondaryRole: true, @@ -17965,10 +18065,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 318: + case 320: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3053 +//line mysql_sql.y:3058 { yyLOCAL = &tree.SetRole{ SecondaryRole: true, @@ -17976,90 +18076,90 @@ yydefault: } } yyVAL.union = yyLOCAL - case 319: + case 321: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3062 +//line mysql_sql.y:3067 { dr := yyDollar[4].setDefaultRoleUnion() dr.Users = yyDollar[6].usersUnion() yyLOCAL = dr } yyVAL.union = yyLOCAL - case 320: + case 322: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.SetDefaultRole -//line mysql_sql.y:3092 +//line mysql_sql.y:3097 { yyLOCAL = &tree.SetDefaultRole{Type: tree.SET_DEFAULT_ROLE_TYPE_NONE, Roles: nil} } yyVAL.union = yyLOCAL - case 321: + case 323: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.SetDefaultRole -//line mysql_sql.y:3096 +//line mysql_sql.y:3101 { yyLOCAL = &tree.SetDefaultRole{Type: tree.SET_DEFAULT_ROLE_TYPE_ALL, Roles: nil} } yyVAL.union = yyLOCAL - case 322: + case 324: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.SetDefaultRole -//line mysql_sql.y:3100 +//line mysql_sql.y:3105 { yyLOCAL = &tree.SetDefaultRole{Type: tree.SET_DEFAULT_ROLE_TYPE_NORMAL, Roles: yyDollar[1].rolesUnion()} } yyVAL.union = yyLOCAL - case 323: + case 325: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3106 +//line mysql_sql.y:3111 { yyLOCAL = &tree.SetVar{Assignments: yyDollar[2].varAssignmentExprsUnion()} } yyVAL.union = yyLOCAL - case 324: + case 326: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3112 +//line mysql_sql.y:3117 { yyLOCAL = &tree.SetPassword{Password: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 325: + case 327: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3116 +//line mysql_sql.y:3121 { yyLOCAL = &tree.SetPassword{User: yyDollar[4].userUnion(), Password: yyDollar[6].str} } yyVAL.union = yyLOCAL - case 327: + case 329: yyDollar = yyS[yypt-4 : yypt+1] -//line mysql_sql.y:3123 +//line mysql_sql.y:3128 { yyVAL.str = yyDollar[3].str } - case 328: + case 330: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.VarAssignmentExpr -//line mysql_sql.y:3129 +//line mysql_sql.y:3134 { yyLOCAL = []*tree.VarAssignmentExpr{yyDollar[1].varAssignmentExprUnion()} } yyVAL.union = yyLOCAL - case 329: + case 331: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.VarAssignmentExpr -//line mysql_sql.y:3133 +//line mysql_sql.y:3138 { yyLOCAL = append(yyDollar[1].varAssignmentExprsUnion(), yyDollar[3].varAssignmentExprUnion()) } yyVAL.union = yyLOCAL - case 330: + case 332: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3139 +//line mysql_sql.y:3144 { yyLOCAL = &tree.VarAssignmentExpr{ System: true, @@ -18069,10 +18169,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 331: + case 333: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3148 +//line mysql_sql.y:3153 { yyLOCAL = &tree.VarAssignmentExpr{ System: true, @@ -18083,10 +18183,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 332: + case 334: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3158 +//line mysql_sql.y:3163 { yyLOCAL = &tree.VarAssignmentExpr{ System: true, @@ -18097,10 +18197,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 333: + case 335: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3168 +//line mysql_sql.y:3173 { yyLOCAL = &tree.VarAssignmentExpr{ System: true, @@ -18110,10 +18210,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 334: + case 336: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3177 +//line mysql_sql.y:3182 { yyLOCAL = &tree.VarAssignmentExpr{ System: true, @@ -18123,10 +18223,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 335: + case 337: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3186 +//line mysql_sql.y:3191 { vs := strings.Split(yyDollar[1].str, ".") var isGlobal bool @@ -18150,10 +18250,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 336: + case 338: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3209 +//line mysql_sql.y:3214 { v := strings.ToLower(yyDollar[1].str) var isGlobal bool @@ -18178,10 +18278,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 337: + case 339: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3233 +//line mysql_sql.y:3238 { yyLOCAL = &tree.VarAssignmentExpr{ SetNames: true, @@ -18190,10 +18290,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 338: + case 340: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3241 +//line mysql_sql.y:3246 { yyLOCAL = &tree.VarAssignmentExpr{ SetNames: true, @@ -18202,10 +18302,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 339: + case 341: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3249 +//line mysql_sql.y:3254 { yyLOCAL = &tree.VarAssignmentExpr{ SetNames: true, @@ -18215,10 +18315,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 340: + case 342: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3258 +//line mysql_sql.y:3263 { yyLOCAL = &tree.VarAssignmentExpr{ SetNames: true, @@ -18227,10 +18327,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 341: + case 343: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3266 +//line mysql_sql.y:3271 { yyLOCAL = &tree.VarAssignmentExpr{ CharsetRequest: true, @@ -18239,10 +18339,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 342: + case 344: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.VarAssignmentExpr -//line mysql_sql.y:3274 +//line mysql_sql.y:3279 { yyLOCAL = &tree.VarAssignmentExpr{ CharsetRequest: true, @@ -18251,260 +18351,260 @@ yydefault: } } yyVAL.union = yyLOCAL - case 343: + case 345: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:3284 +//line mysql_sql.y:3289 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_char) } yyVAL.union = yyLOCAL - case 344: + case 346: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:3288 +//line mysql_sql.y:3293 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_char) } yyVAL.union = yyLOCAL - case 345: + case 347: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:3292 +//line mysql_sql.y:3297 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 346: + case 348: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3298 +//line mysql_sql.y:3303 { yyVAL.str = string(yyDollar[1].str) } - case 347: + case 349: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3302 +//line mysql_sql.y:3307 { yyVAL.str = yyDollar[1].str } - case 348: + case 350: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3308 +//line mysql_sql.y:3313 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 349: + case 351: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:3312 +//line mysql_sql.y:3317 { yyVAL.str = yyDollar[1].cstrUnion().Compare() + "." + yyDollar[3].cstrUnion().Compare() } - case 350: + case 352: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:3318 +//line mysql_sql.y:3323 { yyLOCAL = []string{yyDollar[1].str} } yyVAL.union = yyLOCAL - case 351: + case 353: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:3322 +//line mysql_sql.y:3327 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 358: + case 360: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3336 +//line mysql_sql.y:3341 { yyLOCAL = &tree.SavePoint{Name: tree.Identifier(yyDollar[2].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 359: + case 361: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3342 +//line mysql_sql.y:3347 { yyLOCAL = &tree.ReleaseSavePoint{Name: tree.Identifier(yyDollar[3].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 360: + case 362: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3348 +//line mysql_sql.y:3353 { yyLOCAL = &tree.RollbackToSavePoint{Name: tree.Identifier(yyDollar[3].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 361: + case 363: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3353 +//line mysql_sql.y:3358 { yyLOCAL = &tree.RollbackToSavePoint{Name: tree.Identifier(yyDollar[4].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 362: + case 364: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3358 +//line mysql_sql.y:3363 { yyLOCAL = &tree.RollbackToSavePoint{Name: tree.Identifier(yyDollar[5].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 363: + case 365: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3363 +//line mysql_sql.y:3368 { yyLOCAL = &tree.RollbackToSavePoint{Name: tree.Identifier(yyDollar[4].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 364: + case 366: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3369 +//line mysql_sql.y:3374 { yyLOCAL = &tree.RollbackTransaction{Type: yyDollar[2].completionTypeUnion()} } yyVAL.union = yyLOCAL - case 365: + case 367: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3375 +//line mysql_sql.y:3380 { yyLOCAL = &tree.CommitTransaction{Type: yyDollar[2].completionTypeUnion()} } yyVAL.union = yyLOCAL - case 366: + case 368: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3380 +//line mysql_sql.y:3385 { yyLOCAL = tree.COMPLETION_TYPE_NO_CHAIN } yyVAL.union = yyLOCAL - case 367: + case 369: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3384 +//line mysql_sql.y:3389 { yyLOCAL = tree.COMPLETION_TYPE_NO_CHAIN } yyVAL.union = yyLOCAL - case 368: + case 370: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3388 +//line mysql_sql.y:3393 { yyLOCAL = tree.COMPLETION_TYPE_CHAIN } yyVAL.union = yyLOCAL - case 369: + case 371: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3392 +//line mysql_sql.y:3397 { yyLOCAL = tree.COMPLETION_TYPE_CHAIN } yyVAL.union = yyLOCAL - case 370: + case 372: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3396 +//line mysql_sql.y:3401 { yyLOCAL = tree.COMPLETION_TYPE_RELEASE } yyVAL.union = yyLOCAL - case 371: + case 373: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3400 +//line mysql_sql.y:3405 { yyLOCAL = tree.COMPLETION_TYPE_RELEASE } yyVAL.union = yyLOCAL - case 372: + case 374: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3404 +//line mysql_sql.y:3409 { yyLOCAL = tree.COMPLETION_TYPE_NO_CHAIN } yyVAL.union = yyLOCAL - case 373: + case 375: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3408 +//line mysql_sql.y:3413 { yyLOCAL = tree.COMPLETION_TYPE_NO_CHAIN } yyVAL.union = yyLOCAL - case 374: + case 376: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.CompletionType -//line mysql_sql.y:3412 +//line mysql_sql.y:3417 { yyLOCAL = tree.COMPLETION_TYPE_NO_CHAIN } yyVAL.union = yyLOCAL - case 375: + case 377: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3418 +//line mysql_sql.y:3423 { yyLOCAL = &tree.BeginTransaction{} } yyVAL.union = yyLOCAL - case 376: + case 378: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3422 +//line mysql_sql.y:3427 { yyLOCAL = &tree.BeginTransaction{} } yyVAL.union = yyLOCAL - case 377: + case 379: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3426 +//line mysql_sql.y:3431 { yyLOCAL = &tree.BeginTransaction{} } yyVAL.union = yyLOCAL - case 378: + case 380: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3430 +//line mysql_sql.y:3435 { m := tree.MakeTransactionModes(tree.READ_WRITE_MODE_READ_WRITE) yyLOCAL = &tree.BeginTransaction{Modes: m} } yyVAL.union = yyLOCAL - case 379: + case 381: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3435 +//line mysql_sql.y:3440 { m := tree.MakeTransactionModes(tree.READ_WRITE_MODE_READ_ONLY) yyLOCAL = &tree.BeginTransaction{Modes: m} } yyVAL.union = yyLOCAL - case 380: + case 382: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3440 +//line mysql_sql.y:3445 { yyLOCAL = &tree.BeginTransaction{} } yyVAL.union = yyLOCAL - case 381: + case 383: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3446 +//line mysql_sql.y:3451 { name := yyDollar[2].cstrUnion() secondaryRole := false @@ -18518,10 +18618,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 382: + case 384: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3459 +//line mysql_sql.y:3464 { name := yylex.(*Lexer).GetDbOrTblNameCStr("") secondaryRole := false @@ -18535,10 +18635,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 383: + case 385: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3472 +//line mysql_sql.y:3477 { name := yylex.(*Lexer).GetDbOrTblNameCStr("") secondaryRole := false @@ -18552,10 +18652,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 384: + case 386: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3485 +//line mysql_sql.y:3490 { name := yylex.(*Lexer).GetDbOrTblNameCStr("") secondaryRole := true @@ -18569,10 +18669,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 385: + case 387: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3498 +//line mysql_sql.y:3503 { name := yylex.(*Lexer).GetDbOrTblNameCStr("") secondaryRole := true @@ -18586,10 +18686,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 386: + case 388: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3513 +//line mysql_sql.y:3518 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[1].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18598,10 +18698,10 @@ yydefault: yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 387: + case 389: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3521 +//line mysql_sql.y:3526 { yyDollar[2].statementUnion().(*tree.Update).With = yyDollar[1].withClauseUnion() if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[2].statementUnion()); intoErr != "" { @@ -18611,10 +18711,10 @@ yydefault: yyLOCAL = yyDollar[2].statementUnion() } yyVAL.union = yyLOCAL - case 388: + case 390: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3532 +//line mysql_sql.y:3537 { // Single-table syntax yyLOCAL = &tree.Update{ @@ -18629,10 +18729,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 389: + case 391: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3546 +//line mysql_sql.y:3551 { // Multiple-table syntax yyLOCAL = &tree.Update{ @@ -18646,10 +18746,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 390: + case 392: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3559 +//line mysql_sql.y:3564 { // PostgreSQL-style UPDATE target SET ... FROM source_tables WHERE ... // The target table is kept in Tables; FROM-clause sources are stored @@ -18666,236 +18766,236 @@ yydefault: } } yyVAL.union = yyLOCAL - case 391: + case 393: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:3577 +//line mysql_sql.y:3582 { yyLOCAL = tree.UpdateExprs{yyDollar[1].updateExprUnion()} } yyVAL.union = yyLOCAL - case 392: + case 394: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:3581 +//line mysql_sql.y:3586 { yyLOCAL = append(yyDollar[1].updateExprsUnion(), yyDollar[3].updateExprUnion()) } yyVAL.union = yyLOCAL - case 393: + case 395: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UpdateExpr -//line mysql_sql.y:3587 +//line mysql_sql.y:3592 { yyLOCAL = &tree.UpdateExpr{Names: []*tree.UnresolvedName{yyDollar[1].unresolvedNameUnion()}, Expr: yyDollar[3].exprUnion()} } yyVAL.union = yyLOCAL - case 396: + case 398: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3597 +//line mysql_sql.y:3602 { yyLOCAL = &tree.LockTableStmt{TableLocks: yyDollar[3].tableLocksUnion()} } yyVAL.union = yyLOCAL - case 397: + case 399: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.TableLock -//line mysql_sql.y:3603 +//line mysql_sql.y:3608 { yyLOCAL = []tree.TableLock{yyDollar[1].tableLockUnion()} } yyVAL.union = yyLOCAL - case 398: + case 400: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.TableLock -//line mysql_sql.y:3607 +//line mysql_sql.y:3612 { yyLOCAL = append(yyDollar[1].tableLocksUnion(), yyDollar[3].tableLockUnion()) } yyVAL.union = yyLOCAL - case 399: + case 401: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableLock -//line mysql_sql.y:3613 +//line mysql_sql.y:3618 { yyLOCAL = tree.TableLock{Table: *yyDollar[1].tableNameUnion(), LockType: yyDollar[2].tableLockTypeUnion()} } yyVAL.union = yyLOCAL - case 400: + case 402: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableLockType -//line mysql_sql.y:3619 +//line mysql_sql.y:3624 { yyLOCAL = tree.TableLockRead } yyVAL.union = yyLOCAL - case 401: + case 403: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableLockType -//line mysql_sql.y:3623 +//line mysql_sql.y:3628 { yyLOCAL = tree.TableLockReadLocal } yyVAL.union = yyLOCAL - case 402: + case 404: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableLockType -//line mysql_sql.y:3627 +//line mysql_sql.y:3632 { yyLOCAL = tree.TableLockWrite } yyVAL.union = yyLOCAL - case 403: + case 405: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableLockType -//line mysql_sql.y:3631 +//line mysql_sql.y:3636 { yyLOCAL = tree.TableLockLowPriorityWrite } yyVAL.union = yyLOCAL - case 404: + case 406: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3637 +//line mysql_sql.y:3642 { yyLOCAL = &tree.UnLockTableStmt{} } yyVAL.union = yyLOCAL - case 414: + case 416: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3652 +//line mysql_sql.y:3657 { yyLOCAL = &tree.SetVar{Assignments: yyDollar[2].varAssignmentExprsUnion()} } yyVAL.union = yyLOCAL - case 418: + case 420: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3659 +//line mysql_sql.y:3664 { yyLOCAL = yyDollar[1].selectUnion() } yyVAL.union = yyLOCAL - case 419: + case 421: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3665 +//line mysql_sql.y:3670 { yyLOCAL = tree.NewPrepareStmt(tree.Identifier(yyDollar[2].str), yyDollar[4].statementUnion()) } yyVAL.union = yyLOCAL - case 420: + case 422: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3669 +//line mysql_sql.y:3674 { yyLOCAL = tree.NewPrepareString(tree.Identifier(yyDollar[2].str), yyDollar[4].str) } yyVAL.union = yyLOCAL - case 421: + case 423: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3673 +//line mysql_sql.y:3678 { yyLOCAL = tree.NewPrepareVar(tree.Identifier(yyDollar[2].str), yyDollar[4].varExprUnion()) } yyVAL.union = yyLOCAL - case 422: + case 424: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3679 +//line mysql_sql.y:3684 { yyLOCAL = &tree.ExecuteSQLTask{ Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), } } yyVAL.union = yyLOCAL - case 423: + case 425: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3685 +//line mysql_sql.y:3690 { yyLOCAL = tree.NewExecute(tree.Identifier(yyDollar[2].str)) } yyVAL.union = yyLOCAL - case 424: + case 426: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3689 +//line mysql_sql.y:3694 { yyLOCAL = tree.NewExecuteWithVariables(tree.Identifier(yyDollar[2].str), yyDollar[4].varExprsUnion()) } yyVAL.union = yyLOCAL - case 425: + case 427: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3695 +//line mysql_sql.y:3700 { yyLOCAL = tree.NewDeallocate(tree.Identifier(yyDollar[3].str), false) } yyVAL.union = yyLOCAL - case 426: + case 428: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3701 +//line mysql_sql.y:3706 { yyLOCAL = tree.NewReset(tree.Identifier(yyDollar[3].str)) } yyVAL.union = yyLOCAL - case 432: + case 434: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3712 +//line mysql_sql.y:3717 { yyLOCAL = yyDollar[1].selectUnion() } yyVAL.union = yyLOCAL - case 433: + case 435: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3718 +//line mysql_sql.y:3723 { yyLOCAL = &tree.ShowColumns{Table: yyDollar[2].unresolvedObjectNameUnion()} } yyVAL.union = yyLOCAL - case 434: + case 436: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3722 +//line mysql_sql.y:3727 { yyLOCAL = &tree.ShowColumns{Table: yyDollar[2].unresolvedObjectNameUnion(), ColName: yyDollar[3].unresolvedNameUnion()} } yyVAL.union = yyLOCAL - case 435: + case 437: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3726 +//line mysql_sql.y:3731 { yyLOCAL = tree.NewExplainFor("", integralToUint64(yyDollar[4].item)) } yyVAL.union = yyLOCAL - case 436: + case 438: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3730 +//line mysql_sql.y:3735 { yyLOCAL = tree.NewExplainFor(yyDollar[4].str, integralToUint64(yyDollar[7].item)) } yyVAL.union = yyLOCAL - case 437: + case 439: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3734 +//line mysql_sql.y:3739 { yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 438: + case 440: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3740 +//line mysql_sql.y:3745 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[5].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18907,10 +19007,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[5].statementUnion(), options) } yyVAL.union = yyLOCAL - case 439: + case 441: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3751 +//line mysql_sql.y:3756 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[5].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18922,10 +19022,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[5].statementUnion(), options) } yyVAL.union = yyLOCAL - case 440: + case 442: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3762 +//line mysql_sql.y:3767 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[6].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18938,10 +19038,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[6].statementUnion(), options) } yyVAL.union = yyLOCAL - case 441: + case 443: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3774 +//line mysql_sql.y:3779 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[6].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18954,10 +19054,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[6].statementUnion(), options) } yyVAL.union = yyLOCAL - case 442: + case 444: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3786 +//line mysql_sql.y:3791 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[6].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18970,10 +19070,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[6].statementUnion(), options) } yyVAL.union = yyLOCAL - case 443: + case 445: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3798 +//line mysql_sql.y:3803 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[6].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18986,10 +19086,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[6].statementUnion(), options) } yyVAL.union = yyLOCAL - case 444: + case 446: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3810 +//line mysql_sql.y:3815 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[2].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -18998,10 +19098,10 @@ yydefault: yyLOCAL = tree.NewExplainStmt(yyDollar[2].statementUnion(), "text") } yyVAL.union = yyLOCAL - case 445: + case 447: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3818 +//line mysql_sql.y:3823 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[3].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -19013,10 +19113,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[3].statementUnion(), options) } yyVAL.union = yyLOCAL - case 446: + case 448: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3829 +//line mysql_sql.y:3834 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[3].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -19028,10 +19128,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[3].statementUnion(), options) } yyVAL.union = yyLOCAL - case 447: + case 449: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3840 +//line mysql_sql.y:3845 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[4].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -19044,10 +19144,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[4].statementUnion(), options) } yyVAL.union = yyLOCAL - case 448: + case 450: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3852 +//line mysql_sql.y:3857 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[3].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -19059,10 +19159,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[3].statementUnion(), options) } yyVAL.union = yyLOCAL - case 449: + case 451: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3863 +//line mysql_sql.y:3868 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[4].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -19075,10 +19175,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[4].statementUnion(), options) } yyVAL.union = yyLOCAL - case 450: + case 452: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3875 +//line mysql_sql.y:3880 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[4].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -19091,10 +19191,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[4].statementUnion(), options) } yyVAL.union = yyLOCAL - case 451: + case 453: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3887 +//line mysql_sql.y:3892 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[5].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -19103,18 +19203,18 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[5].statementUnion(), yyDollar[3].explainOptionsUnion()) } yyVAL.union = yyLOCAL - case 452: + case 454: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3895 +//line mysql_sql.y:3900 { yyLOCAL = tree.MakeExplainStmt(yyDollar[3].statementUnion(), nil) } yyVAL.union = yyLOCAL - case 453: + case 455: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3899 +//line mysql_sql.y:3904 { options := []tree.OptionElem{ tree.MakeOptionElem(tree.VerboseOption, "NULL"), @@ -19122,10 +19222,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[4].statementUnion(), options) } yyVAL.union = yyLOCAL - case 454: + case 456: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3906 +//line mysql_sql.y:3911 { options := []tree.OptionElem{ tree.MakeOptionElem(tree.AnalyzeOption, "NULL"), @@ -19133,10 +19233,10 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[4].statementUnion(), options) } yyVAL.union = yyLOCAL - case 455: + case 457: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3913 +//line mysql_sql.y:3918 { options := []tree.OptionElem{ tree.MakeOptionElem(tree.AnalyzeOption, "NULL"), @@ -19145,170 +19245,170 @@ yydefault: yyLOCAL = tree.MakeExplainStmt(yyDollar[5].statementUnion(), options) } yyVAL.union = yyLOCAL - case 470: + case 472: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.OptionElem -//line mysql_sql.y:3951 +//line mysql_sql.y:3956 { yyLOCAL = []tree.OptionElem{yyDollar[1].explainOptionUnion()} } yyVAL.union = yyLOCAL - case 471: + case 473: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.OptionElem -//line mysql_sql.y:3955 +//line mysql_sql.y:3960 { yyLOCAL = append(yyDollar[1].explainOptionsUnion(), yyDollar[3].explainOptionUnion()) } yyVAL.union = yyLOCAL - case 472: + case 474: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.OptionElem -//line mysql_sql.y:3961 +//line mysql_sql.y:3966 { yyLOCAL = tree.MakeOptionElem(yyDollar[1].str, yyDollar[2].str) } yyVAL.union = yyLOCAL - case 473: + case 475: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3967 +//line mysql_sql.y:3972 { yyVAL.str = yyDollar[1].str } - case 474: + case 476: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3972 +//line mysql_sql.y:3977 { yyVAL.str = "true" } - case 475: + case 477: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3973 +//line mysql_sql.y:3978 { yyVAL.str = "false" } - case 476: + case 478: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3974 +//line mysql_sql.y:3979 { yyVAL.str = yyDollar[1].str } - case 477: + case 479: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:3975 +//line mysql_sql.y:3980 { yyVAL.str = yyDollar[1].str } - case 478: + case 480: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:3979 +//line mysql_sql.y:3984 { stmt := tree.NewAnalyzeStmt(yyDollar[3].analyzeTableEntriesUnion()) stmt.FullScan = yyDollar[4].boolValUnion() yyLOCAL = stmt } yyVAL.union = yyLOCAL - case 479: + case 481: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:3987 +//line mysql_sql.y:3992 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 480: + case 482: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:3991 +//line mysql_sql.y:3996 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 481: + case 483: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.AnalyzeTableEntry -//line mysql_sql.y:3997 +//line mysql_sql.y:4002 { yyLOCAL = []*tree.AnalyzeTableEntry{yyDollar[1].analyzeTableEntryUnion()} } yyVAL.union = yyLOCAL - case 482: + case 484: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.AnalyzeTableEntry -//line mysql_sql.y:4001 +//line mysql_sql.y:4006 { yyLOCAL = append(yyDollar[1].analyzeTableEntriesUnion(), yyDollar[3].analyzeTableEntryUnion()) } yyVAL.union = yyLOCAL - case 483: + case 485: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.AnalyzeTableEntry -//line mysql_sql.y:4007 +//line mysql_sql.y:4012 { yyLOCAL = &tree.AnalyzeTableEntry{Table: yyDollar[1].tableNameUnion()} } yyVAL.union = yyLOCAL - case 484: + case 486: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.AnalyzeTableEntry -//line mysql_sql.y:4011 +//line mysql_sql.y:4016 { yyLOCAL = &tree.AnalyzeTableEntry{Table: yyDollar[1].tableNameUnion(), Cols: yyDollar[3].identifierListUnion()} } yyVAL.union = yyLOCAL - case 485: + case 487: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4017 +//line mysql_sql.y:4022 { yyLOCAL = tree.NewCheckTableStmt(yyDollar[3].tableNamesUnion(), yyDollar[4].checkTableOptionUnion()) } yyVAL.union = yyLOCAL - case 486: + case 488: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.CheckTableOption -//line mysql_sql.y:4023 +//line mysql_sql.y:4028 { yyLOCAL = tree.CheckTableOptionNone } yyVAL.union = yyLOCAL - case 487: + case 489: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.CheckTableOption -//line mysql_sql.y:4027 +//line mysql_sql.y:4032 { yyLOCAL = tree.CheckTableOptionExtended } yyVAL.union = yyLOCAL - case 488: + case 490: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.CheckTableOption -//line mysql_sql.y:4031 +//line mysql_sql.y:4036 { yyLOCAL = tree.CheckTableOptionForUpgrade } yyVAL.union = yyLOCAL - case 489: + case 491: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4037 +//line mysql_sql.y:4042 { yyLOCAL = tree.NewShowProfileStmt(yyDollar[3].int64ValUnion(), yyDollar[4].limitUnion()) } yyVAL.union = yyLOCAL - case 490: + case 492: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:4043 +//line mysql_sql.y:4048 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 491: + case 493: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:4047 +//line mysql_sql.y:4052 { value, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -19317,10 +19417,10 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 492: + case 494: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4055 +//line mysql_sql.y:4060 { yyLOCAL = &tree.UpgradeStatement{ Target: yyDollar[3].upgrade_targetUnion(), @@ -19328,10 +19428,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 493: + case 495: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Target -//line mysql_sql.y:4064 +//line mysql_sql.y:4069 { yyLOCAL = &tree.Target{ AccountName: yyDollar[1].str, @@ -19339,10 +19439,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 494: + case 496: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Target -//line mysql_sql.y:4071 +//line mysql_sql.y:4076 { yyLOCAL = &tree.Target{ AccountName: "", @@ -19350,18 +19450,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 495: + case 497: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:4079 +//line mysql_sql.y:4084 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 496: + case 498: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:4083 +//line mysql_sql.y:4088 { res, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -19374,10 +19474,10 @@ yydefault: yyLOCAL = res } yyVAL.union = yyLOCAL - case 512: + case 515: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4113 +//line mysql_sql.y:4119 { yyLOCAL = &tree.AlterIcebergCatalog{ Name: tree.Identifier(yyDollar[4].cstrUnion().Compare()), @@ -19385,10 +19485,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 513: + case 516: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4120 +//line mysql_sql.y:4126 { yyLOCAL = &tree.AlterIcebergCatalog{ Name: tree.Identifier(yyDollar[4].cstrUnion().Compare()), @@ -19396,10 +19496,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 514: + case 517: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4129 +//line mysql_sql.y:4135 { yyLOCAL = &tree.AlterMongoDBConnection{ Name: tree.Identifier(yyDollar[4].cstrUnion().Compare()), @@ -19408,10 +19508,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 515: + case 518: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4137 +//line mysql_sql.y:4143 { yyLOCAL = &tree.AlterMongoDBConnection{ Name: tree.Identifier(yyDollar[4].cstrUnion().Compare()), @@ -19420,10 +19520,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 516: + case 519: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4145 +//line mysql_sql.y:4151 { yyLOCAL = &tree.AlterMongoDBConnection{ Name: tree.Identifier(yyDollar[4].cstrUnion().Compare()), @@ -19431,10 +19531,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 517: + case 520: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4152 +//line mysql_sql.y:4158 { yyLOCAL = &tree.AlterMongoDBConnection{ Name: tree.Identifier(yyDollar[4].cstrUnion().Compare()), @@ -19442,10 +19542,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 518: + case 521: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4161 +//line mysql_sql.y:4167 { var ifExists = yyDollar[3].boolValUnion() var name = yyDollar[4].tableNameUnion() @@ -19467,10 +19567,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 519: + case 522: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4184 +//line mysql_sql.y:4190 { var ifExists = yyDollar[3].boolValUnion() var name = yyDollar[4].tableNameUnion() @@ -19479,10 +19579,10 @@ yydefault: yyLOCAL = tree.NewAlterView(ifExists, name, colNames, asSource) } yyVAL.union = yyLOCAL - case 520: + case 523: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4194 +//line mysql_sql.y:4200 { var table = yyDollar[3].tableNameUnion() alterTable := tree.NewAlterTable(table) @@ -19490,10 +19590,10 @@ yydefault: yyLOCAL = alterTable } yyVAL.union = yyLOCAL - case 521: + case 524: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4201 +//line mysql_sql.y:4207 { var table = yyDollar[3].tableNameUnion() alterTable := tree.NewAlterTable(table) @@ -19501,10 +19601,10 @@ yydefault: yyLOCAL = alterTable } yyVAL.union = yyLOCAL - case 522: + case 525: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4208 +//line mysql_sql.y:4214 { var table = yyDollar[3].tableNameUnion() alterTable := tree.NewAlterTable(table) @@ -19512,36 +19612,36 @@ yydefault: yyLOCAL = alterTable } yyVAL.union = yyLOCAL - case 523: + case 526: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4217 +//line mysql_sql.y:4223 { alterTables := yyDollar[3].renameTableOptionsUnion() renameTables := tree.NewRenameTable(alterTables) yyLOCAL = renameTables } yyVAL.union = yyLOCAL - case 524: + case 527: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.AlterTable -//line mysql_sql.y:4225 +//line mysql_sql.y:4231 { yyLOCAL = []*tree.AlterTable{yyDollar[1].renameTableOptionUnion()} } yyVAL.union = yyLOCAL - case 525: + case 528: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.AlterTable -//line mysql_sql.y:4229 +//line mysql_sql.y:4235 { yyLOCAL = append(yyDollar[1].renameTableOptionsUnion(), yyDollar[3].renameTableOptionUnion()) } yyVAL.union = yyLOCAL - case 526: + case 529: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.AlterTable -//line mysql_sql.y:4235 +//line mysql_sql.y:4241 { var table = yyDollar[1].tableNameUnion() alterTable := tree.NewAlterTable(table) @@ -19550,10 +19650,10 @@ yydefault: yyLOCAL = alterTable } yyVAL.union = yyLOCAL - case 527: + case 530: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4245 +//line mysql_sql.y:4251 { var io *tree.IndexOption = nil if yyDollar[5].indexOptionUnion() == nil { @@ -19567,10 +19667,10 @@ yydefault: yyLOCAL = tree.NewAlterOptionAlterReIndex(name, io) } yyVAL.union = yyLOCAL - case 528: + case 531: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4258 +//line mysql_sql.y:4264 { var io *tree.IndexOption = nil if yyDollar[5].indexOptionUnion() == nil { @@ -19584,10 +19684,10 @@ yydefault: yyLOCAL = tree.NewAlterOptionAlterReIndex(name, io) } yyVAL.union = yyLOCAL - case 529: + case 532: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4271 +//line mysql_sql.y:4277 { var io *tree.IndexOption = nil if yyDollar[5].indexOptionUnion() == nil { @@ -19601,10 +19701,10 @@ yydefault: yyLOCAL = tree.NewAlterOptionAlterReIndex(name, io) } yyVAL.union = yyLOCAL - case 530: + case 533: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4284 +//line mysql_sql.y:4290 { var io *tree.IndexOption = nil if yyDollar[5].indexOptionUnion() == nil { @@ -19618,10 +19718,10 @@ yydefault: yyLOCAL = tree.NewAlterOptionAlterReIndex(name, io) } yyVAL.union = yyLOCAL - case 531: + case 534: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4297 +//line mysql_sql.y:4303 { var io *tree.IndexOption = nil if yyDollar[5].indexOptionUnion() == nil { @@ -19635,34 +19735,34 @@ yydefault: yyLOCAL = tree.NewAlterOptionAlterReIndex(name, io) } yyVAL.union = yyLOCAL - case 532: + case 535: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AlterTableOptions -//line mysql_sql.y:4312 +//line mysql_sql.y:4318 { yyLOCAL = []tree.AlterTableOption{yyDollar[1].alterTableOptionUnion()} } yyVAL.union = yyLOCAL - case 533: + case 536: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOptions -//line mysql_sql.y:4316 +//line mysql_sql.y:4322 { yyLOCAL = append(yyDollar[1].alterTableOptionsUnion(), yyDollar[3].alterTableOptionUnion()) } yyVAL.union = yyLOCAL - case 534: + case 537: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AlterPartitionOption -//line mysql_sql.y:4322 +//line mysql_sql.y:4328 { yyLOCAL = yyDollar[1].alterPartitionOptionUnion() } yyVAL.union = yyLOCAL - case 535: + case 538: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.AlterPartitionOption -//line mysql_sql.y:4326 +//line mysql_sql.y:4332 { yyDollar[3].partitionByUnion().Num = uint64(yyDollar[4].int64ValUnion()) var PartBy = yyDollar[3].partitionByUnion() @@ -19685,10 +19785,10 @@ yydefault: yyLOCAL = tree.AlterPartitionOption(opt) } yyVAL.union = yyLOCAL - case 536: + case 539: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4350 +//line mysql_sql.y:4356 { var ifExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -19697,10 +19797,10 @@ yydefault: yyLOCAL = tree.NewAlterPitr(ifExists, name, pitrValue, pitrUnit) } yyVAL.union = yyLOCAL - case 537: + case 540: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4360 +//line mysql_sql.y:4366 { yyLOCAL = &tree.AlterSQLTask{ Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), @@ -19708,10 +19808,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 538: + case 541: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4367 +//line mysql_sql.y:4373 { yyLOCAL = &tree.AlterSQLTask{ Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), @@ -19719,10 +19819,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 539: + case 542: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4374 +//line mysql_sql.y:4380 { yyLOCAL = &tree.AlterSQLTask{ Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), @@ -19732,10 +19832,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 540: + case 543: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4383 +//line mysql_sql.y:4389 { yyLOCAL = &tree.AlterSQLTask{ Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), @@ -19744,10 +19844,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 541: + case 544: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4391 +//line mysql_sql.y:4397 { yyLOCAL = &tree.AlterSQLTask{ Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), @@ -19756,10 +19856,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 542: + case 545: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4399 +//line mysql_sql.y:4405 { yyLOCAL = &tree.AlterSQLTask{ Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), @@ -19768,30 +19868,30 @@ yydefault: } } yyVAL.union = yyLOCAL - case 543: + case 546: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4409 +//line mysql_sql.y:4415 { var oldName = yyDollar[5].cstrUnion().Compare() var newName = yyDollar[8].cstrUnion().Compare() yyLOCAL = tree.NewAlterRole(true, oldName, newName) } yyVAL.union = yyLOCAL - case 544: + case 547: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4415 +//line mysql_sql.y:4421 { var oldName = yyDollar[3].cstrUnion().Compare() var newName = yyDollar[6].cstrUnion().Compare() yyLOCAL = tree.NewAlterRole(false, oldName, newName) } yyVAL.union = yyLOCAL - case 545: + case 548: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4421 +//line mysql_sql.y:4427 { var roleName = yyDollar[3].cstrUnion().Compare() var ruleSQL = yyDollar[6].str @@ -19801,10 +19901,10 @@ yydefault: yyLOCAL = tree.NewAlterRoleAddRule(roleName, ruleName, ruleSQL, dbName, tblName) } yyVAL.union = yyLOCAL - case 546: + case 549: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4430 +//line mysql_sql.y:4436 { var roleName = yyDollar[3].cstrUnion().Compare() var dbName = yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[8].cstrUnion().Origin()).Compare() @@ -19812,10 +19912,10 @@ yydefault: yyLOCAL = tree.NewAlterRoleDropRule(roleName, dbName, tblName) } yyVAL.union = yyLOCAL - case 547: + case 550: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterPartitionOption -//line mysql_sql.y:4439 +//line mysql_sql.y:4445 { var typ = tree.AlterPartitionAddPartition var partitions = yyDollar[3].partitionsUnion() @@ -19826,10 +19926,10 @@ yydefault: yyLOCAL = tree.AlterPartitionOption(opt) } yyVAL.union = yyLOCAL - case 548: + case 551: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterPartitionOption -//line mysql_sql.y:4449 +//line mysql_sql.y:4455 { var typ = tree.AlterPartitionDropPartition var partitionNames = yyDollar[3].PartitionNamesUnion() @@ -19846,10 +19946,10 @@ yydefault: yyLOCAL = tree.AlterPartitionOption(opt) } yyVAL.union = yyLOCAL - case 549: + case 552: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterPartitionOption -//line mysql_sql.y:4465 +//line mysql_sql.y:4471 { var typ = tree.AlterPartitionTruncatePartition var partitionNames = yyDollar[3].PartitionNamesUnion() @@ -19866,52 +19966,52 @@ yydefault: yyLOCAL = tree.AlterPartitionOption(opt) } yyVAL.union = yyLOCAL - case 550: + case 553: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:4483 +//line mysql_sql.y:4489 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 551: + case 554: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:4487 +//line mysql_sql.y:4493 { yyLOCAL = yyDollar[1].PartitionNamesUnion() } yyVAL.union = yyLOCAL - case 552: + case 555: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:4493 +//line mysql_sql.y:4499 { yyLOCAL = tree.IdentifierList{tree.Identifier(yyDollar[1].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 553: + case 556: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:4497 +//line mysql_sql.y:4503 { yyLOCAL = append(yyDollar[1].PartitionNamesUnion(), tree.Identifier(yyDollar[3].cstrUnion().Compare())) } yyVAL.union = yyLOCAL - case 554: + case 557: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4503 +//line mysql_sql.y:4509 { var def = yyDollar[2].tableDefUnion() opt := tree.NewAlterOptionAdd(def) yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 555: + case 558: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4509 +//line mysql_sql.y:4515 { var typ = tree.AlterTableModifyColumn var newColumn = yyDollar[3].columnTableDefUnion() @@ -19920,10 +20020,10 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 556: + case 559: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4517 +//line mysql_sql.y:4523 { // Type OldColumnName NewColumn Position var typ = tree.AlterTableChangeColumn @@ -19934,10 +20034,10 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 557: + case 560: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4527 +//line mysql_sql.y:4533 { var typ = tree.AlterTableRenameColumn var oldColumnName = yyDollar[3].unresolvedNameUnion() @@ -19946,10 +20046,10 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 558: + case 561: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4535 +//line mysql_sql.y:4541 { var typ = tree.AlterTableAlterColumn var columnName = yyDollar[3].unresolvedNameUnion() @@ -19960,10 +20060,10 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 559: + case 562: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4545 +//line mysql_sql.y:4551 { var typ = tree.AlterTableAlterColumn var columnName = yyDollar[3].unresolvedNameUnion() @@ -19974,10 +20074,10 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 560: + case 563: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4555 +//line mysql_sql.y:4561 { var typ = tree.AlterTableAlterColumn var columnName = yyDollar[3].unresolvedNameUnion() @@ -19988,10 +20088,10 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 561: + case 564: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4565 +//line mysql_sql.y:4571 { var orderByClauseType = tree.AlterTableOrderByColumn var orderByColumnList = yyDollar[3].alterColumnOrderByUnion() @@ -19999,42 +20099,42 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 562: + case 565: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4572 +//line mysql_sql.y:4578 { yyLOCAL = tree.AlterTableOption(yyDollar[2].alterTableOptionUnion()) } yyVAL.union = yyLOCAL - case 563: + case 566: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4576 +//line mysql_sql.y:4582 { yyLOCAL = tree.AlterTableOption(yyDollar[2].alterTableOptionUnion()) } yyVAL.union = yyLOCAL - case 564: + case 567: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4580 +//line mysql_sql.y:4586 { yyLOCAL = tree.AlterTableOption(yyDollar[1].tableOptionUnion()) } yyVAL.union = yyLOCAL - case 565: + case 568: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4584 +//line mysql_sql.y:4590 { yyLOCAL = tree.AlterTableOption(yyDollar[3].alterTableOptionUnion()) } yyVAL.union = yyLOCAL - case 566: + case 569: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4588 +//line mysql_sql.y:4594 { var column = yyDollar[3].columnTableDefUnion() var position = yyDollar[4].alterColPositionUnion() @@ -20042,38 +20142,38 @@ yydefault: yyLOCAL = tree.AlterTableOption(opt) } yyVAL.union = yyLOCAL - case 567: + case 570: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4595 +//line mysql_sql.y:4601 { yyLOCAL = tree.NewAlterOptionAlgorithm(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 568: + case 571: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4599 +//line mysql_sql.y:4605 { opt := tree.NewTableOptionCharset(yyDollar[4].str) opt.Collate = yyDollar[7].str yyLOCAL = opt } yyVAL.union = yyLOCAL - case 569: + case 572: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4605 +//line mysql_sql.y:4611 { opt := tree.NewTableOptionCharset(yyDollar[5].str) opt.Convert = true yyLOCAL = opt } yyVAL.union = yyLOCAL - case 570: + case 573: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4611 +//line mysql_sql.y:4617 { opt := tree.NewTableOptionCharset(yyDollar[5].str) opt.Collate = yyDollar[8].str @@ -20081,181 +20181,181 @@ yydefault: yyLOCAL = opt } yyVAL.union = yyLOCAL - case 571: + case 574: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4618 +//line mysql_sql.y:4624 { opt := tree.NewTableOptionCharset(yyDollar[1].str) opt.NonCharsetSyntax = true yyLOCAL = opt } yyVAL.union = yyLOCAL - case 572: + case 575: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4624 +//line mysql_sql.y:4630 { opt := tree.NewTableOptionCharset(yyDollar[1].str) opt.NonCharsetSyntax = true yyLOCAL = opt } yyVAL.union = yyLOCAL - case 573: + case 576: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4630 +//line mysql_sql.y:4636 { opt := tree.NewTableOptionCharset(yyDollar[1].str) opt.NonCharsetSyntax = true yyLOCAL = opt } yyVAL.union = yyLOCAL - case 574: + case 577: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4636 +//line mysql_sql.y:4642 { yyLOCAL = tree.NewAlterOptionLock(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 575: + case 578: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4640 +//line mysql_sql.y:4646 { opt := tree.NewTableOptionCharset(yyDollar[1].str) opt.NonCharsetSyntax = true yyLOCAL = opt } yyVAL.union = yyLOCAL - case 576: + case 579: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:4647 +//line mysql_sql.y:4653 { yyVAL.str = "" } - case 593: + case 596: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:4678 +//line mysql_sql.y:4684 { yyVAL.str = "" } - case 594: + case 597: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:4682 +//line mysql_sql.y:4688 { yyVAL.str = string("COLUMN") } - case 595: + case 598: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ColumnPosition -//line mysql_sql.y:4687 +//line mysql_sql.y:4693 { var typ = tree.ColumnPositionNone var relativeColumn *tree.UnresolvedName yyLOCAL = tree.NewColumnPosition(typ, relativeColumn) } yyVAL.union = yyLOCAL - case 596: + case 599: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.ColumnPosition -//line mysql_sql.y:4693 +//line mysql_sql.y:4699 { var typ = tree.ColumnPositionFirst var relativeColumn *tree.UnresolvedName yyLOCAL = tree.NewColumnPosition(typ, relativeColumn) } yyVAL.union = yyLOCAL - case 597: + case 600: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ColumnPosition -//line mysql_sql.y:4699 +//line mysql_sql.y:4705 { var typ = tree.ColumnPositionAfter var relativeColumn = yyDollar[2].unresolvedNameUnion() yyLOCAL = tree.NewColumnPosition(typ, relativeColumn) } yyVAL.union = yyLOCAL - case 598: + case 601: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.AlterColumnOrder -//line mysql_sql.y:4707 +//line mysql_sql.y:4713 { yyLOCAL = []*tree.AlterColumnOrder{yyDollar[1].alterColumnOrderUnion()} } yyVAL.union = yyLOCAL - case 599: + case 602: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.AlterColumnOrder -//line mysql_sql.y:4711 +//line mysql_sql.y:4717 { yyLOCAL = append(yyDollar[1].alterColumnOrderByUnion(), yyDollar[3].alterColumnOrderUnion()) } yyVAL.union = yyLOCAL - case 600: + case 603: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.AlterColumnOrder -//line mysql_sql.y:4717 +//line mysql_sql.y:4723 { var column = yyDollar[1].unresolvedNameUnion() var direction = yyDollar[2].directionUnion() yyLOCAL = tree.NewAlterColumnOrder(column, direction) } yyVAL.union = yyLOCAL - case 601: + case 604: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4725 +//line mysql_sql.y:4731 { var name = yyDollar[1].unresolvedObjectNameUnion() yyLOCAL = tree.NewAlterOptionTableName(name) } yyVAL.union = yyLOCAL - case 602: + case 605: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4732 +//line mysql_sql.y:4738 { var dropType = tree.AlterTableDropIndex var name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) yyLOCAL = tree.NewAlterOptionDrop(dropType, name) } yyVAL.union = yyLOCAL - case 603: + case 606: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4738 +//line mysql_sql.y:4744 { var dropType = tree.AlterTableDropKey var name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) yyLOCAL = tree.NewAlterOptionDrop(dropType, name) } yyVAL.union = yyLOCAL - case 604: + case 607: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4744 +//line mysql_sql.y:4750 { var dropType = tree.AlterTableDropColumn var name = tree.Identifier(yyDollar[1].cstrUnion().Compare()) yyLOCAL = tree.NewAlterOptionDrop(dropType, name) } yyVAL.union = yyLOCAL - case 605: + case 608: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4750 +//line mysql_sql.y:4756 { var dropType = tree.AlterTableDropColumn var name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) yyLOCAL = tree.NewAlterOptionDrop(dropType, name) } yyVAL.union = yyLOCAL - case 606: + case 609: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4756 +//line mysql_sql.y:4762 { var dropType = tree.AlterTableDropForeignKey var name = tree.Identifier(yyDollar[3].cstrUnion().Compare()) @@ -20263,10 +20363,10 @@ yydefault: } yyVAL.union = yyLOCAL - case 607: + case 610: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4763 +//line mysql_sql.y:4769 { yyLOCAL = &tree.AlterOptionDrop{ Typ: tree.AlterTableDropConstraint, @@ -20274,38 +20374,38 @@ yydefault: } } yyVAL.union = yyLOCAL - case 608: + case 611: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4770 +//line mysql_sql.y:4776 { yyLOCAL = tree.NewAlterOptionDrop(tree.AlterTableDropCheck, tree.Identifier(yyDollar[2].cstrUnion().Compare())) } yyVAL.union = yyLOCAL - case 609: + case 612: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4774 +//line mysql_sql.y:4780 { var dropType = tree.AlterTableDropPrimaryKey var name = tree.Identifier("") yyLOCAL = tree.NewAlterOptionDrop(dropType, name) } yyVAL.union = yyLOCAL - case 610: + case 613: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4782 +//line mysql_sql.y:4788 { var indexName = tree.Identifier(yyDollar[2].cstrUnion().Compare()) var visibility = yyDollar[3].indexVisibilityUnion() yyLOCAL = tree.NewAlterOptionAlterIndex(indexName, visibility) } yyVAL.union = yyLOCAL - case 611: + case 614: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4788 +//line mysql_sql.y:4794 { var io *tree.IndexOption = nil if yyDollar[5].indexOptionUnion() == nil { @@ -20321,62 +20421,62 @@ yydefault: yyLOCAL = tree.NewAlterOptionAlterAutoUpdate(name, io) } yyVAL.union = yyLOCAL - case 612: + case 615: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4803 +//line mysql_sql.y:4809 { var checkType = yyDollar[1].str var enforce = yyDollar[3].boolValUnion() yyLOCAL = tree.NewAlterOptionAlterCheck(checkType, enforce) } yyVAL.union = yyLOCAL - case 613: + case 616: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOption -//line mysql_sql.y:4809 +//line mysql_sql.y:4815 { var checkType = yyDollar[1].str var enforce = yyDollar[3].boolValUnion() yyLOCAL = tree.NewAlterOptionAlterCheck(checkType, enforce) } yyVAL.union = yyLOCAL - case 614: + case 617: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.VisibleType -//line mysql_sql.y:4817 +//line mysql_sql.y:4823 { yyLOCAL = tree.VISIBLE_TYPE_VISIBLE } yyVAL.union = yyLOCAL - case 615: + case 618: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.VisibleType -//line mysql_sql.y:4821 +//line mysql_sql.y:4827 { yyLOCAL = tree.VISIBLE_TYPE_INVISIBLE } yyVAL.union = yyLOCAL - case 616: + case 619: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:4827 +//line mysql_sql.y:4833 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 617: + case 620: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:4831 +//line mysql_sql.y:4837 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 618: + case 621: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4837 +//line mysql_sql.y:4843 { var ifExists = yyDollar[3].boolValUnion() var name = yyDollar[4].exprUnion() @@ -20393,74 +20493,74 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 619: + case 622: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4855 +//line mysql_sql.y:4861 { yyLOCAL = &tree.AlterDatabase{Name: tree.Identifier(yyDollar[3].str), Options: yyDollar[4].createOptionsUnion()} } yyVAL.union = yyLOCAL - case 620: + case 623: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4859 +//line mysql_sql.y:4865 { yyLOCAL = &tree.AlterDatabase{Options: yyDollar[3].createOptionsUnion()} } yyVAL.union = yyLOCAL - case 621: + case 624: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:4865 +//line mysql_sql.y:4871 { yyLOCAL = []tree.CreateOption{yyDollar[1].createOptionUnion()} } yyVAL.union = yyLOCAL - case 622: + case 625: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:4869 +//line mysql_sql.y:4875 { yyLOCAL = append(yyDollar[1].createOptionsUnion(), yyDollar[2].createOptionUnion()) } yyVAL.union = yyLOCAL - case 623: + case 626: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:4875 +//line mysql_sql.y:4881 { yyLOCAL = tree.NewCreateOptionCharset(false, yyDollar[4].str) } yyVAL.union = yyLOCAL - case 624: + case 627: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:4879 +//line mysql_sql.y:4885 { yyLOCAL = tree.NewCreateOptionCharset(true, yyDollar[5].str) } yyVAL.union = yyLOCAL - case 625: + case 628: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:4883 +//line mysql_sql.y:4889 { yyLOCAL = tree.NewCreateOptionCollate(false, yyDollar[3].str) } yyVAL.union = yyLOCAL - case 626: + case 629: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:4887 +//line mysql_sql.y:4893 { yyLOCAL = tree.NewCreateOptionCollate(true, yyDollar[4].str) } yyVAL.union = yyLOCAL - case 627: + case 630: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4893 +//line mysql_sql.y:4899 { var accountName = "" var dbName = yyDollar[3].str @@ -20476,10 +20576,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 628: + case 631: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4908 +//line mysql_sql.y:4914 { var accountName = "" var dbName = yyDollar[3].str @@ -20495,10 +20595,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 629: + case 632: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4923 +//line mysql_sql.y:4929 { var accountName = yyDollar[4].str var dbName = "" @@ -20514,10 +20614,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 630: + case 633: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4938 +//line mysql_sql.y:4944 { assignments := []*tree.VarAssignmentExpr{ { @@ -20530,20 +20630,20 @@ yydefault: yyLOCAL = &tree.SetVar{Assignments: assignments} } yyVAL.union = yyLOCAL - case 631: + case 634: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.AlterAccountAuthOption -//line mysql_sql.y:4951 +//line mysql_sql.y:4957 { yyLOCAL = tree.AlterAccountAuthOption{ Exist: false, } } yyVAL.union = yyLOCAL - case 632: + case 635: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.AlterAccountAuthOption -//line mysql_sql.y:4957 +//line mysql_sql.y:4963 { yyLOCAL = tree.AlterAccountAuthOption{ Exist: true, @@ -20553,10 +20653,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 633: + case 636: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4968 +//line mysql_sql.y:4974 { // Create temporary variables with meaningful names ifExists := yyDollar[3].boolValUnion() @@ -20569,10 +20669,10 @@ yydefault: yyLOCAL = tree.NewAlterUser(ifExists, users, role, miscOpt, commentOrAttribute) } yyVAL.union = yyLOCAL - case 634: + case 637: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4980 +//line mysql_sql.y:4986 { ifExists := yyDollar[3].boolValUnion() var Username = yyDollar[4].usernameRecordUnion().Username @@ -20584,10 +20684,10 @@ yydefault: yyLOCAL = tree.NewAlterUser(ifExists, users, nil, miscOpt, commentOrAttribute) } yyVAL.union = yyLOCAL - case 635: + case 638: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:4991 +//line mysql_sql.y:4997 { ifExists := yyDollar[3].boolValUnion() var Username = yyDollar[4].usernameRecordUnion().Username @@ -20599,18 +20699,18 @@ yydefault: yyLOCAL = tree.NewAlterUser(ifExists, users, nil, miscOpt, commentOrAttribute) } yyVAL.union = yyLOCAL - case 636: + case 639: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Role -//line mysql_sql.y:5003 +//line mysql_sql.y:5009 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 637: + case 640: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Role -//line mysql_sql.y:5007 +//line mysql_sql.y:5013 { var UserName = yyDollar[3].str yyLOCAL = tree.NewRole( @@ -20618,66 +20718,66 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 638: + case 641: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:5015 +//line mysql_sql.y:5021 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 639: + case 642: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:5019 +//line mysql_sql.y:5025 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 640: + case 643: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5024 +//line mysql_sql.y:5030 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 641: + case 644: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5028 +//line mysql_sql.y:5034 { yyLOCAL = yyDollar[1].userMiscOptionUnion() } yyVAL.union = yyLOCAL - case 642: + case 645: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5044 +//line mysql_sql.y:5050 { yyLOCAL = tree.NewUserMiscOptionAccountUnlock() } yyVAL.union = yyLOCAL - case 643: + case 646: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5048 +//line mysql_sql.y:5054 { yyLOCAL = tree.NewUserMiscOptionAccountLock() } yyVAL.union = yyLOCAL - case 644: + case 647: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5052 +//line mysql_sql.y:5058 { yyLOCAL = tree.NewUserMiscOptionPasswordExpireNone() } yyVAL.union = yyLOCAL - case 645: + case 648: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5056 +//line mysql_sql.y:5062 { Value, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -20688,34 +20788,34 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 646: + case 649: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5064 +//line mysql_sql.y:5070 { yyLOCAL = tree.NewUserMiscOptionPasswordExpireNever() } yyVAL.union = yyLOCAL - case 647: + case 650: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5068 +//line mysql_sql.y:5074 { yyLOCAL = tree.NewUserMiscOptionPasswordExpireDefault() } yyVAL.union = yyLOCAL - case 648: + case 651: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5072 +//line mysql_sql.y:5078 { yyLOCAL = tree.NewUserMiscOptionPasswordHistoryDefault() } yyVAL.union = yyLOCAL - case 649: + case 652: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5076 +//line mysql_sql.y:5082 { Value, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -20726,18 +20826,18 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 650: + case 653: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5084 +//line mysql_sql.y:5090 { yyLOCAL = tree.NewUserMiscOptionPasswordReuseIntervalDefault() } yyVAL.union = yyLOCAL - case 651: + case 654: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5088 +//line mysql_sql.y:5094 { Value, ok := signedIntegral(yylex, yyDollar[4].item) if !ok { @@ -20748,34 +20848,34 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 652: + case 655: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5096 +//line mysql_sql.y:5102 { yyLOCAL = tree.NewUserMiscOptionPasswordRequireCurrentNone() } yyVAL.union = yyLOCAL - case 653: + case 656: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5100 +//line mysql_sql.y:5106 { yyLOCAL = tree.NewUserMiscOptionPasswordRequireCurrentDefault() } yyVAL.union = yyLOCAL - case 654: + case 657: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5104 +//line mysql_sql.y:5110 { yyLOCAL = tree.NewUserMiscOptionPasswordRequireCurrentOptional() } yyVAL.union = yyLOCAL - case 655: + case 658: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5108 +//line mysql_sql.y:5114 { Value, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -20786,10 +20886,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 656: + case 659: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5116 +//line mysql_sql.y:5122 { Value, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -20800,38 +20900,38 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 657: + case 660: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.UserMiscOption -//line mysql_sql.y:5124 +//line mysql_sql.y:5130 { yyLOCAL = tree.NewUserMiscOptionPasswordLockTimeUnbounded() } yyVAL.union = yyLOCAL - case 658: + case 661: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:5130 +//line mysql_sql.y:5136 { yyVAL.item = nil } - case 659: + case 662: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:5135 +//line mysql_sql.y:5141 { yyVAL.item = nil } - case 705: + case 708: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5190 +//line mysql_sql.y:5196 { yyLOCAL = &tree.ShowSQLTasks{} } yyVAL.union = yyLOCAL - case 706: + case 709: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5196 +//line mysql_sql.y:5202 { stmt := &tree.ShowSQLTaskRuns{} if yyDollar[4].str != "" { @@ -20845,38 +20945,38 @@ yydefault: yyLOCAL = stmt } yyVAL.union = yyLOCAL - case 707: + case 710: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:5210 +//line mysql_sql.y:5216 { yyVAL.str = "" } - case 708: + case 711: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:5214 +//line mysql_sql.y:5220 { yyVAL.str = yyDollar[2].cstrUnion().Compare() } - case 709: + case 712: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:5219 +//line mysql_sql.y:5225 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 710: + case 713: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:5223 +//line mysql_sql.y:5229 { yyLOCAL = sqlTaskInt64(yyDollar[2].item) } yyVAL.union = yyLOCAL - case 711: + case 714: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5229 +//line mysql_sql.y:5235 { yyLOCAL = &tree.ShowIcebergCatalogs{ Like: yyDollar[4].comparisionExprUnion(), @@ -20884,10 +20984,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 712: + case 715: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5237 +//line mysql_sql.y:5243 { yyLOCAL = &tree.ShowIcebergNamespaces{ Catalog: tree.Identifier(yyDollar[5].cstrUnion().Compare()), @@ -20896,10 +20996,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 713: + case 716: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5245 +//line mysql_sql.y:5251 { yyLOCAL = &tree.ShowIcebergNamespaces{ Catalog: tree.Identifier(yyDollar[6].cstrUnion().Compare()), @@ -20908,10 +21008,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 714: + case 717: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5253 +//line mysql_sql.y:5259 { yyLOCAL = &tree.ShowIcebergNamespaces{ Like: yyDollar[4].comparisionExprUnion(), @@ -20919,10 +21019,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 715: + case 718: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5260 +//line mysql_sql.y:5266 { yyLOCAL = &tree.ShowIcebergTables{ Like: yyDollar[4].comparisionExprUnion(), @@ -20930,10 +21030,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 716: + case 719: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5267 +//line mysql_sql.y:5273 { yyLOCAL = &tree.ShowIcebergTables{ Catalog: tree.Identifier(yyDollar[5].cstrUnion().Compare()), @@ -20942,10 +21042,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 717: + case 720: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5275 +//line mysql_sql.y:5281 { yyLOCAL = &tree.ShowIcebergTables{ Catalog: tree.Identifier(yyDollar[5].cstrUnion().Compare()), @@ -20955,10 +21055,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 718: + case 721: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5284 +//line mysql_sql.y:5290 { yyLOCAL = &tree.ShowIcebergTables{ Catalog: tree.Identifier(yyDollar[6].cstrUnion().Compare()), @@ -20967,10 +21067,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 719: + case 722: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5292 +//line mysql_sql.y:5298 { yyLOCAL = &tree.ShowIcebergTables{ Namespace: yyDollar[6].str, @@ -20979,10 +21079,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 720: + case 723: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5300 +//line mysql_sql.y:5306 { yyLOCAL = &tree.ShowIcebergTables{ Namespace: yyDollar[6].str, @@ -20992,10 +21092,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 721: + case 724: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5311 +//line mysql_sql.y:5317 { yyLOCAL = &tree.ShowMongoDBConnections{ Like: yyDollar[4].comparisionExprUnion(), @@ -21003,50 +21103,50 @@ yydefault: } } yyVAL.union = yyLOCAL - case 722: + case 725: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:5320 +//line mysql_sql.y:5326 { yyVAL.str = yyDollar[1].str } - case 723: + case 726: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5326 +//line mysql_sql.y:5332 { yyLOCAL = &tree.ShowLogserviceReplicas{} } yyVAL.union = yyLOCAL - case 724: + case 727: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5332 +//line mysql_sql.y:5338 { yyLOCAL = &tree.ShowLogserviceStores{} } yyVAL.union = yyLOCAL - case 725: + case 728: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5338 +//line mysql_sql.y:5344 { yyLOCAL = &tree.ShowLogserviceSettings{} } yyVAL.union = yyLOCAL - case 726: + case 729: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5344 +//line mysql_sql.y:5350 { yyLOCAL = &tree.ShowRules{ RoleName: yyDollar[5].cstrUnion().Compare(), } } yyVAL.union = yyLOCAL - case 727: + case 730: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5352 +//line mysql_sql.y:5358 { yyLOCAL = &tree.ShowCollation{ Like: yyDollar[3].comparisionExprUnion(), @@ -21054,50 +21154,50 @@ yydefault: } } yyVAL.union = yyLOCAL - case 728: + case 731: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5361 +//line mysql_sql.y:5367 { yyLOCAL = &tree.ShowStages{ Like: yyDollar[3].comparisionExprUnion(), } } yyVAL.union = yyLOCAL - case 729: + case 732: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5369 +//line mysql_sql.y:5375 { yyLOCAL = &tree.ShowSnapShots{ Where: yyDollar[3].whereUnion(), } } yyVAL.union = yyLOCAL - case 730: + case 733: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5377 +//line mysql_sql.y:5383 { yyLOCAL = &tree.ShowPitr{ Where: yyDollar[3].whereUnion(), } } yyVAL.union = yyLOCAL - case 731: + case 734: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5385 +//line mysql_sql.y:5391 { yyLOCAL = &tree.ShowRecoveryWindow{ Level: tree.RECOVERYWINDOWLEVELACCOUNT, } } yyVAL.union = yyLOCAL - case 732: + case 735: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5391 +//line mysql_sql.y:5397 { yyLOCAL = &tree.ShowRecoveryWindow{ Level: tree.RECOVERYWINDOWLEVELDATABASE, @@ -21105,10 +21205,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 733: + case 736: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5398 +//line mysql_sql.y:5404 { yyLOCAL = &tree.ShowRecoveryWindow{ Level: tree.RECOVERYWINDOWLEVELTABLE, @@ -21117,10 +21217,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 734: + case 737: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5406 +//line mysql_sql.y:5412 { yyLOCAL = &tree.ShowRecoveryWindow{ Level: tree.RECOVERYWINDOWLEVELACCOUNT, @@ -21128,34 +21228,34 @@ yydefault: } } yyVAL.union = yyLOCAL - case 735: + case 738: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5415 +//line mysql_sql.y:5421 { yyLOCAL = &tree.ShowGrants{ShowGrantType: tree.GrantForUser} } yyVAL.union = yyLOCAL - case 736: + case 739: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5419 +//line mysql_sql.y:5425 { yyLOCAL = &tree.ShowGrants{Username: yyDollar[4].usernameRecordUnion().Username, Hostname: yyDollar[4].usernameRecordUnion().Hostname, Roles: yyDollar[5].rolesUnion(), ShowGrantType: tree.GrantForUser} } yyVAL.union = yyLOCAL - case 737: + case 740: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5423 +//line mysql_sql.y:5429 { yyLOCAL = &tree.ShowGrants{CurrentUser: true, Roles: yyDollar[6].rolesUnion(), ShowGrantType: tree.GrantForUser} } yyVAL.union = yyLOCAL - case 738: + case 741: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5427 +//line mysql_sql.y:5433 { s := &tree.ShowGrants{} roles := []*tree.Role{ @@ -21166,44 +21266,44 @@ yydefault: yyLOCAL = s } yyVAL.union = yyLOCAL - case 739: + case 742: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.Role -//line mysql_sql.y:5438 +//line mysql_sql.y:5444 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 740: + case 743: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.Role -//line mysql_sql.y:5442 +//line mysql_sql.y:5448 { yyLOCAL = yyDollar[2].rolesUnion() } yyVAL.union = yyLOCAL - case 741: + case 744: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5448 +//line mysql_sql.y:5454 { yyLOCAL = &tree.ShowTableStatus{DbName: yyDollar[5].str, Like: yyDollar[6].comparisionExprUnion(), Where: yyDollar[7].whereUnion()} } yyVAL.union = yyLOCAL - case 742: + case 745: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:5453 +//line mysql_sql.y:5459 { } - case 744: + case 747: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:5457 +//line mysql_sql.y:5463 { } - case 746: + case 749: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5462 +//line mysql_sql.y:5468 { yyLOCAL = &tree.ShowFunctionOrProcedureStatus{ Like: yyDollar[4].comparisionExprUnion(), @@ -21212,10 +21312,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 747: + case 750: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5472 +//line mysql_sql.y:5478 { yyLOCAL = &tree.ShowFunctionOrProcedureStatus{ Like: yyDollar[4].comparisionExprUnion(), @@ -21224,68 +21324,68 @@ yydefault: } } yyVAL.union = yyLOCAL - case 748: + case 751: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5482 +//line mysql_sql.y:5488 { yyLOCAL = &tree.ShowRolesStmt{ Like: yyDollar[3].comparisionExprUnion(), } } yyVAL.union = yyLOCAL - case 749: + case 752: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5490 +//line mysql_sql.y:5496 { yyLOCAL = &tree.ShowNodeList{} } yyVAL.union = yyLOCAL - case 750: + case 753: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5496 +//line mysql_sql.y:5502 { yyLOCAL = &tree.ShowLocks{} } yyVAL.union = yyLOCAL - case 751: + case 754: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5502 +//line mysql_sql.y:5508 { yyLOCAL = &tree.ShowTableNumber{DbName: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 752: + case 755: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5508 +//line mysql_sql.y:5514 { yyLOCAL = &tree.ShowColumnNumber{Table: yyDollar[3].unresolvedObjectNameUnion(), DbName: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 753: + case 756: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5514 +//line mysql_sql.y:5520 { yyLOCAL = &tree.ShowTableValues{Table: yyDollar[3].unresolvedObjectNameUnion(), DbName: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 754: + case 757: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5520 +//line mysql_sql.y:5526 { yyLOCAL = &tree.ShowTableSize{Table: yyDollar[3].unresolvedObjectNameUnion(), DbName: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 755: + case 758: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5526 +//line mysql_sql.y:5532 { s := yyDollar[2].statementUnion().(*tree.ShowTarget) s.Like = yyDollar[3].comparisionExprUnion() @@ -21293,74 +21393,74 @@ yydefault: yyLOCAL = s } yyVAL.union = yyLOCAL - case 756: + case 759: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5535 +//line mysql_sql.y:5541 { yyLOCAL = &tree.ShowTarget{Type: tree.ShowConfig} } yyVAL.union = yyLOCAL - case 757: + case 760: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5539 +//line mysql_sql.y:5545 { yyLOCAL = &tree.ShowTarget{Type: tree.ShowCharset} } yyVAL.union = yyLOCAL - case 758: + case 761: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5543 +//line mysql_sql.y:5549 { yyLOCAL = &tree.ShowTarget{Type: tree.ShowEngines} } yyVAL.union = yyLOCAL - case 759: + case 762: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5547 +//line mysql_sql.y:5553 { yyLOCAL = &tree.ShowTarget{DbName: yyDollar[3].str, Type: tree.ShowTriggers} } yyVAL.union = yyLOCAL - case 760: + case 763: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5551 +//line mysql_sql.y:5557 { yyLOCAL = &tree.ShowTarget{DbName: yyDollar[3].str, Type: tree.ShowEvents} } yyVAL.union = yyLOCAL - case 761: + case 764: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5555 +//line mysql_sql.y:5561 { yyLOCAL = &tree.ShowTarget{Type: tree.ShowPlugins} } yyVAL.union = yyLOCAL - case 762: + case 765: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5559 +//line mysql_sql.y:5565 { yyLOCAL = &tree.ShowTarget{Type: tree.ShowPrivileges} } yyVAL.union = yyLOCAL - case 763: + case 766: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5563 +//line mysql_sql.y:5569 { yyLOCAL = &tree.ShowTarget{Type: tree.ShowProfiles} } yyVAL.union = yyLOCAL - case 764: + case 767: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5569 +//line mysql_sql.y:5575 { yyLOCAL = &tree.ShowIndex{ TableName: yyDollar[4].unresolvedObjectNameUnion(), @@ -21369,20 +21469,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 765: + case 768: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:5578 +//line mysql_sql.y:5584 { } - case 766: + case 769: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:5580 +//line mysql_sql.y:5586 { } - case 770: + case 773: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5589 +//line mysql_sql.y:5595 { yyLOCAL = &tree.ShowVariables{ Global: yyDollar[2].boolValUnion(), @@ -21391,10 +21491,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 771: + case 774: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5599 +//line mysql_sql.y:5605 { yyLOCAL = &tree.ShowStatus{ Global: yyDollar[2].boolValUnion(), @@ -21403,74 +21503,74 @@ yydefault: } } yyVAL.union = yyLOCAL - case 772: + case 775: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:5608 +//line mysql_sql.y:5614 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 773: + case 776: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:5612 +//line mysql_sql.y:5618 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 774: + case 777: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:5616 +//line mysql_sql.y:5622 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 775: + case 778: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5622 +//line mysql_sql.y:5628 { yyLOCAL = &tree.ShowWarnings{Limit: yyDollar[3].limitUnion()} } yyVAL.union = yyLOCAL - case 776: + case 779: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5626 +//line mysql_sql.y:5632 { yyLOCAL = &tree.ShowWarnings{Count: true} } yyVAL.union = yyLOCAL - case 777: + case 780: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5632 +//line mysql_sql.y:5638 { yyLOCAL = &tree.ShowErrors{Limit: yyDollar[3].limitUnion()} } yyVAL.union = yyLOCAL - case 778: + case 781: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5636 +//line mysql_sql.y:5642 { yyLOCAL = &tree.ShowErrors{Count: true} } yyVAL.union = yyLOCAL - case 779: + case 782: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5642 +//line mysql_sql.y:5648 { yyLOCAL = &tree.ShowProcessList{Full: yyDollar[2].fullOptUnion()} } yyVAL.union = yyLOCAL - case 780: + case 783: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5648 +//line mysql_sql.y:5654 { yyLOCAL = &tree.ShowSequences{ DBName: yyDollar[3].str, @@ -21478,10 +21578,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 781: + case 784: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5657 +//line mysql_sql.y:5663 { yyLOCAL = &tree.ShowTables{ Open: false, @@ -21493,10 +21593,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 782: + case 785: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5668 +//line mysql_sql.y:5674 { yyLOCAL = &tree.ShowTables{ Open: true, @@ -21507,10 +21607,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 783: + case 786: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5680 +//line mysql_sql.y:5686 { yyLOCAL = &tree.ShowDatabases{ Like: yyDollar[3].comparisionExprUnion(), @@ -21519,18 +21619,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 784: + case 787: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5688 +//line mysql_sql.y:5694 { yyLOCAL = &tree.ShowDatabases{Like: yyDollar[3].comparisionExprUnion(), Where: yyDollar[4].whereUnion()} } yyVAL.union = yyLOCAL - case 785: + case 788: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5694 +//line mysql_sql.y:5700 { yyLOCAL = &tree.ShowColumns{ Ext: false, @@ -21543,10 +21643,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 786: + case 789: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5706 +//line mysql_sql.y:5712 { yyLOCAL = &tree.ShowColumns{ Ext: true, @@ -21559,134 +21659,134 @@ yydefault: } } yyVAL.union = yyLOCAL - case 787: + case 790: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5720 +//line mysql_sql.y:5726 { yyLOCAL = &tree.ShowAccounts{Like: yyDollar[3].comparisionExprUnion()} } yyVAL.union = yyLOCAL - case 788: + case 791: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5726 +//line mysql_sql.y:5732 { yyLOCAL = &tree.ShowPublications{Like: yyDollar[3].comparisionExprUnion()} } yyVAL.union = yyLOCAL - case 789: + case 792: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5732 +//line mysql_sql.y:5738 { yyLOCAL = &tree.ShowPublicationCoverage{Name: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 790: + case 793: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5738 +//line mysql_sql.y:5744 { yyLOCAL = &tree.ShowAccountUpgrade{} } yyVAL.union = yyLOCAL - case 791: + case 794: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5744 +//line mysql_sql.y:5750 { yyLOCAL = &tree.ShowSubscriptions{Like: yyDollar[3].comparisionExprUnion()} } yyVAL.union = yyLOCAL - case 792: + case 795: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5748 +//line mysql_sql.y:5754 { yyLOCAL = &tree.ShowSubscriptions{All: true, Like: yyDollar[4].comparisionExprUnion()} } yyVAL.union = yyLOCAL - case 793: + case 796: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5754 +//line mysql_sql.y:5760 { yyLOCAL = &tree.ShowCcprSubscriptions{TaskId: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 794: + case 797: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5758 +//line mysql_sql.y:5764 { yyLOCAL = &tree.ShowCcprSubscriptions{} } yyVAL.union = yyLOCAL - case 795: + case 798: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ComparisonExpr -//line mysql_sql.y:5763 +//line mysql_sql.y:5769 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 796: + case 799: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ComparisonExpr -//line mysql_sql.y:5767 +//line mysql_sql.y:5773 { yyLOCAL = tree.NewComparisonExpr(tree.LIKE, nil, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 797: + case 800: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ComparisonExpr -//line mysql_sql.y:5771 +//line mysql_sql.y:5777 { yyLOCAL = tree.NewComparisonExpr(tree.ILIKE, nil, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 798: + case 801: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:5776 +//line mysql_sql.y:5782 { yyVAL.str = "" } - case 799: + case 802: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:5780 +//line mysql_sql.y:5786 { yyVAL.str = yyDollar[2].cstrUnion().Compare() } - case 800: + case 803: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnresolvedObjectName -//line mysql_sql.y:5786 +//line mysql_sql.y:5792 { yyLOCAL = yyDollar[2].unresolvedObjectNameUnion() } yyVAL.union = yyLOCAL - case 805: + case 808: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:5799 +//line mysql_sql.y:5805 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 806: + case 809: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:5803 +//line mysql_sql.y:5809 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 807: + case 810: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5809 +//line mysql_sql.y:5815 { yyLOCAL = &tree.ShowCreateTable{ Name: yyDollar[4].unresolvedObjectNameUnion(), @@ -21694,10 +21794,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 808: + case 811: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5817 +//line mysql_sql.y:5823 { yyLOCAL = &tree.ShowCreateView{ Name: yyDollar[4].unresolvedObjectNameUnion(), @@ -21705,10 +21805,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 809: + case 812: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5824 +//line mysql_sql.y:5830 { yyLOCAL = &tree.ShowCreateDatabase{ IfNotExists: yyDollar[4].ifNotExistsUnion(), @@ -21717,94 +21817,94 @@ yydefault: } } yyVAL.union = yyLOCAL - case 810: + case 813: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5832 +//line mysql_sql.y:5838 { yyLOCAL = &tree.ShowCreatePublications{Name: yyDollar[4].str} } yyVAL.union = yyLOCAL - case 811: + case 814: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5838 +//line mysql_sql.y:5844 { yyLOCAL = &tree.ShowBackendServers{} } yyVAL.union = yyLOCAL - case 812: + case 815: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnresolvedObjectName -//line mysql_sql.y:5844 +//line mysql_sql.y:5850 { tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedObjectName(tblName) } yyVAL.union = yyLOCAL - case 813: + case 816: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UnresolvedObjectName -//line mysql_sql.y:5849 +//line mysql_sql.y:5855 { dbName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[3].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedObjectName(dbName, tblName) } yyVAL.union = yyLOCAL - case 814: + case 817: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:5857 +//line mysql_sql.y:5863 { yyVAL.str = yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) } - case 815: + case 818: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnresolvedObjectName -//line mysql_sql.y:5863 +//line mysql_sql.y:5869 { tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedObjectName(tblName) } yyVAL.union = yyLOCAL - case 816: + case 819: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UnresolvedObjectName -//line mysql_sql.y:5868 +//line mysql_sql.y:5874 { dbName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[3].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedObjectName(dbName, tblName) } yyVAL.union = yyLOCAL - case 817: + case 820: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.UnresolvedObjectName -//line mysql_sql.y:5874 +//line mysql_sql.y:5880 { yyLOCAL = tree.NewUnresolvedObjectName(yyDollar[1].cstrUnion().Compare(), yyDollar[3].cstrUnion().Compare(), yyDollar[5].cstrUnion().Compare()) } yyVAL.union = yyLOCAL - case 818: + case 821: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5880 +//line mysql_sql.y:5886 { yyLOCAL = tree.NewTruncateTable(yyDollar[2].tableNameUnion()) } yyVAL.union = yyLOCAL - case 819: + case 822: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5884 +//line mysql_sql.y:5890 { yyLOCAL = tree.NewTruncateTable(yyDollar[3].tableNameUnion()) } yyVAL.union = yyLOCAL - case 841: + case 845: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5915 +//line mysql_sql.y:5922 { yyLOCAL = &tree.DropSQLTask{ IfExists: yyDollar[3].boolValUnion(), @@ -21812,10 +21912,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 842: + case 846: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5924 +//line mysql_sql.y:5931 { yyLOCAL = &tree.DropIcebergCatalog{ IfExists: yyDollar[4].boolValUnion(), @@ -21823,10 +21923,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 843: + case 847: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5933 +//line mysql_sql.y:5940 { yyLOCAL = &tree.DropMongoDBConnection{ IfExists: yyDollar[4].boolValUnion(), @@ -21834,56 +21934,56 @@ yydefault: } } yyVAL.union = yyLOCAL - case 844: + case 848: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5942 +//line mysql_sql.y:5949 { var ifExists = yyDollar[3].boolValUnion() var name = yyDollar[4].tableNamesUnion() yyLOCAL = tree.NewDropSequence(ifExists, name) } yyVAL.union = yyLOCAL - case 845: + case 849: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5950 +//line mysql_sql.y:5957 { var ifExists = yyDollar[3].boolValUnion() var name = yyDollar[4].exprUnion() yyLOCAL = tree.NewDropAccount(ifExists, name) } yyVAL.union = yyLOCAL - case 846: + case 850: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5958 +//line mysql_sql.y:5965 { var ifExists = yyDollar[3].boolValUnion() var users = yyDollar[4].usersUnion() yyLOCAL = tree.NewDropUser(ifExists, users) } yyVAL.union = yyLOCAL - case 847: + case 851: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.User -//line mysql_sql.y:5966 +//line mysql_sql.y:5973 { yyLOCAL = []*tree.User{yyDollar[1].userUnion()} } yyVAL.union = yyLOCAL - case 848: + case 852: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.User -//line mysql_sql.y:5970 +//line mysql_sql.y:5977 { yyLOCAL = append(yyDollar[1].usersUnion(), yyDollar[3].userUnion()) } yyVAL.union = yyLOCAL - case 849: + case 853: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.User -//line mysql_sql.y:5976 +//line mysql_sql.y:5983 { var Username = yyDollar[1].usernameRecordUnion().Username var Hostname = yyDollar[1].usernameRecordUnion().Hostname @@ -21895,20 +21995,20 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 850: + case 854: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5989 +//line mysql_sql.y:5996 { var ifExists = yyDollar[3].boolValUnion() var roles = yyDollar[4].rolesUnion() yyLOCAL = tree.NewDropRole(ifExists, roles) } yyVAL.union = yyLOCAL - case 851: + case 855: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:5997 +//line mysql_sql.y:6004 { var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) var tableName = yyDollar[6].tableNameUnion() @@ -21916,10 +22016,10 @@ yydefault: yyLOCAL = tree.NewDropIndex(name, tableName, ifExists) } yyVAL.union = yyLOCAL - case 852: + case 856: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6006 +//line mysql_sql.y:6013 { var ifExists = yyDollar[4].boolValUnion() var names = yyDollar[5].tableNamesUnion() @@ -21928,48 +22028,48 @@ yydefault: yyLOCAL = stmt } yyVAL.union = yyLOCAL - case 853: + case 857: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6016 +//line mysql_sql.y:6023 { var ifExists = yyDollar[3].boolValUnion() var names = yyDollar[4].tableNamesUnion() yyLOCAL = tree.NewDropView(ifExists, names) } yyVAL.union = yyLOCAL - case 854: + case 858: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6024 +//line mysql_sql.y:6031 { var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) var ifExists = yyDollar[3].boolValUnion() yyLOCAL = tree.NewDropDatabase(name, ifExists) } yyVAL.union = yyLOCAL - case 855: + case 859: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6030 +//line mysql_sql.y:6037 { var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) var ifExists = yyDollar[3].boolValUnion() yyLOCAL = tree.NewDropDatabase(name, ifExists) } yyVAL.union = yyLOCAL - case 856: + case 860: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6038 +//line mysql_sql.y:6045 { yyLOCAL = tree.NewDeallocate(tree.Identifier(yyDollar[3].str), true) } yyVAL.union = yyLOCAL - case 857: + case 861: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6044 +//line mysql_sql.y:6051 { var ifExists = yyDollar[3].boolValUnion() var name = yyDollar[4].functionNameUnion() @@ -21979,30 +22079,30 @@ yydefault: yyLOCAL = dropFunction } yyVAL.union = yyLOCAL - case 858: + case 862: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6055 +//line mysql_sql.y:6062 { var name = yyDollar[3].procNameUnion() var ifExists = false yyLOCAL = tree.NewDropProcedure(name, ifExists) } yyVAL.union = yyLOCAL - case 859: + case 863: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6061 +//line mysql_sql.y:6068 { var name = yyDollar[5].procNameUnion() var ifExists = true yyLOCAL = tree.NewDropProcedure(name, ifExists) } yyVAL.union = yyLOCAL - case 860: + case 864: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6069 +//line mysql_sql.y:6076 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[1].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -22011,10 +22111,10 @@ yydefault: yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 861: + case 865: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6077 +//line mysql_sql.y:6084 { if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[1].statementUnion()); intoErr != "" { yylex.Error(intoErr) @@ -22023,10 +22123,10 @@ yydefault: yyLOCAL = yyDollar[1].statementUnion() } yyVAL.union = yyLOCAL - case 862: + case 866: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6085 +//line mysql_sql.y:6092 { yyDollar[2].statementUnion().(*tree.Delete).With = yyDollar[1].withClauseUnion() if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[2].statementUnion()); intoErr != "" { @@ -22036,10 +22136,10 @@ yydefault: yyLOCAL = yyDollar[2].statementUnion() } yyVAL.union = yyLOCAL - case 863: + case 867: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6094 +//line mysql_sql.y:6101 { yyDollar[2].statementUnion().(*tree.Delete).With = yyDollar[1].withClauseUnion() if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[2].statementUnion()); intoErr != "" { @@ -22049,10 +22149,10 @@ yydefault: yyLOCAL = yyDollar[2].statementUnion() } yyVAL.union = yyLOCAL - case 864: + case 868: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6105 +//line mysql_sql.y:6112 { // Single-Table Syntax t := &tree.AliasedTableExpr{ @@ -22074,10 +22174,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 865: + case 869: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6126 +//line mysql_sql.y:6133 { // Multiple-Table Syntax yyLOCAL = &tree.Delete{ @@ -22091,10 +22191,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 866: + case 870: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6141 +//line mysql_sql.y:6148 { // Multiple-Table Syntax yyLOCAL = &tree.Delete{ @@ -22108,36 +22208,36 @@ yydefault: } } yyVAL.union = yyLOCAL - case 867: + case 871: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableExprs -//line mysql_sql.y:6156 +//line mysql_sql.y:6163 { yyLOCAL = tree.TableExprs{yyDollar[1].tableNameUnion()} } yyVAL.union = yyLOCAL - case 868: + case 872: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableExprs -//line mysql_sql.y:6160 +//line mysql_sql.y:6167 { yyLOCAL = append(yyDollar[1].tableExprsUnion(), yyDollar[3].tableNameUnion()) } yyVAL.union = yyLOCAL - case 869: + case 873: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.TableName -//line mysql_sql.y:6166 +//line mysql_sql.y:6173 { tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) prefix := tree.ObjectNamePrefix{ExplicitSchema: false} yyLOCAL = tree.NewTableName(tree.Identifier(tblName), prefix, nil) } yyVAL.union = yyLOCAL - case 870: + case 874: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.TableName -//line mysql_sql.y:6172 +//line mysql_sql.y:6179 { dbName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[3].cstrUnion().Origin()) @@ -22145,49 +22245,49 @@ yydefault: yyLOCAL = tree.NewTableName(tree.Identifier(tblName), prefix, nil) } yyVAL.union = yyLOCAL - case 871: + case 875: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:6181 +//line mysql_sql.y:6188 { } - case 872: + case 876: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:6183 +//line mysql_sql.y:6190 { } - case 873: + case 877: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:6186 +//line mysql_sql.y:6193 { yyVAL.str = "" } - case 878: + case 882: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:6195 +//line mysql_sql.y:6202 { yyVAL.str = "" } - case 880: + case 884: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:6199 +//line mysql_sql.y:6206 { yyVAL.str = "" } - case 881: + case 885: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:6203 +//line mysql_sql.y:6210 { yyVAL.str = "ignore" } - case 882: + case 886: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:6211 +//line mysql_sql.y:6218 { } - case 885: + case 889: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6217 +//line mysql_sql.y:6224 { rep := yyDollar[5].replaceUnion() if intoErr := tree.ValidateSelectIntoNotAllowed(rep.Rows); intoErr != "" { @@ -22203,10 +22303,10 @@ yydefault: yyLOCAL = rep } yyVAL.union = yyLOCAL - case 886: + case 890: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Replace -//line mysql_sql.y:6234 +//line mysql_sql.y:6241 { vc := tree.NewValuesClause(yyDollar[2].rowsExprsUnion()) yyLOCAL = &tree.Replace{ @@ -22214,20 +22314,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 887: + case 891: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Replace -//line mysql_sql.y:6241 +//line mysql_sql.y:6248 { yyLOCAL = &tree.Replace{ Rows: yyDollar[1].selectUnion(), } } yyVAL.union = yyLOCAL - case 888: + case 892: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.Replace -//line mysql_sql.y:6247 +//line mysql_sql.y:6254 { vc := tree.NewValuesClause(yyDollar[5].rowsExprsUnion()) yyLOCAL = &tree.Replace{ @@ -22237,10 +22337,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 889: + case 893: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Replace -//line mysql_sql.y:6256 +//line mysql_sql.y:6263 { vc := tree.NewValuesClause(yyDollar[4].rowsExprsUnion()) yyLOCAL = &tree.Replace{ @@ -22248,10 +22348,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 890: + case 894: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Replace -//line mysql_sql.y:6263 +//line mysql_sql.y:6270 { yyLOCAL = &tree.Replace{ Columns: yyDollar[2].insertColumnsUnion().Identifiers, @@ -22260,10 +22360,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 891: + case 895: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Replace -//line mysql_sql.y:6271 +//line mysql_sql.y:6278 { if yyDollar[2].assignmentsUnion() == nil { yylex.Error("the set list of replace can not be empty") @@ -22286,10 +22386,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 893: + case 897: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6296 +//line mysql_sql.y:6303 { yyDollar[2].statementUnion().(*tree.Insert).With = yyDollar[1].withClauseUnion() if intoErr := tree.ValidateSelectIntoEnclosingStatement(yyDollar[2].statementUnion()); intoErr != "" { @@ -22299,19 +22399,19 @@ yydefault: yyLOCAL = yyDollar[2].statementUnion() } yyVAL.union = yyLOCAL - case 895: + case 899: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6306 +//line mysql_sql.y:6313 { yyDollar[2].statementUnion().(*tree.MultiInsert).With = yyDollar[1].withClauseUnion() yyLOCAL = yyDollar[2].statementUnion() } yyVAL.union = yyLOCAL - case 896: + case 900: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6316 +//line mysql_sql.y:6323 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[4].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -22320,10 +22420,10 @@ yydefault: yyLOCAL = &tree.MultiInsert{Targets: yyDollar[3].multiInsertTargetsUnion(), Source: yyDollar[4].selectUnion()} } yyVAL.union = yyLOCAL - case 897: + case 901: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6324 +//line mysql_sql.y:6331 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[5].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -22332,10 +22432,10 @@ yydefault: yyLOCAL = &tree.MultiInsert{Whens: yyDollar[3].multiInsertWhensUnion(), Else: yyDollar[4].multiInsertTargetsUnion(), Source: yyDollar[5].selectUnion()} } yyVAL.union = yyLOCAL - case 898: + case 902: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6332 +//line mysql_sql.y:6339 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[5].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -22344,98 +22444,98 @@ yydefault: yyLOCAL = &tree.MultiInsert{First: true, Whens: yyDollar[3].multiInsertWhensUnion(), Else: yyDollar[4].multiInsertTargetsUnion(), Source: yyDollar[5].selectUnion()} } yyVAL.union = yyLOCAL - case 899: + case 903: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.MultiInsertWhen -//line mysql_sql.y:6342 +//line mysql_sql.y:6349 { yyLOCAL = []*tree.MultiInsertWhen{yyDollar[1].multiInsertWhenUnion()} } yyVAL.union = yyLOCAL - case 900: + case 904: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.MultiInsertWhen -//line mysql_sql.y:6346 +//line mysql_sql.y:6353 { yyLOCAL = append(yyDollar[1].multiInsertWhensUnion(), yyDollar[2].multiInsertWhenUnion()) } yyVAL.union = yyLOCAL - case 901: + case 905: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.MultiInsertWhen -//line mysql_sql.y:6352 +//line mysql_sql.y:6359 { yyLOCAL = &tree.MultiInsertWhen{Cond: yyDollar[2].exprUnion(), Targets: yyDollar[4].multiInsertTargetsUnion()} } yyVAL.union = yyLOCAL - case 902: + case 906: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.MultiInsertTarget -//line mysql_sql.y:6357 +//line mysql_sql.y:6364 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 903: + case 907: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.MultiInsertTarget -//line mysql_sql.y:6361 +//line mysql_sql.y:6368 { yyLOCAL = yyDollar[2].multiInsertTargetsUnion() } yyVAL.union = yyLOCAL - case 904: + case 908: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.MultiInsertTarget -//line mysql_sql.y:6367 +//line mysql_sql.y:6374 { yyLOCAL = []*tree.MultiInsertTarget{yyDollar[1].multiInsertTargetUnion()} } yyVAL.union = yyLOCAL - case 905: + case 909: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.MultiInsertTarget -//line mysql_sql.y:6371 +//line mysql_sql.y:6378 { yyLOCAL = append(yyDollar[1].multiInsertTargetsUnion(), yyDollar[2].multiInsertTargetUnion()) } yyVAL.union = yyLOCAL - case 906: + case 910: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.MultiInsertTarget -//line mysql_sql.y:6377 +//line mysql_sql.y:6384 { yyLOCAL = &tree.MultiInsertTarget{Table: yyDollar[2].tableNameUnion()} } yyVAL.union = yyLOCAL - case 907: + case 911: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.MultiInsertTarget -//line mysql_sql.y:6381 +//line mysql_sql.y:6388 { yyLOCAL = &tree.MultiInsertTarget{Table: yyDollar[2].tableNameUnion(), Values: yyDollar[5].exprsUnion()} } yyVAL.union = yyLOCAL - case 908: + case 912: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.MultiInsertTarget -//line mysql_sql.y:6385 +//line mysql_sql.y:6392 { yyLOCAL = &tree.MultiInsertTarget{Table: yyDollar[2].tableNameUnion(), Columns: yyDollar[4].insertColumnsUnion().Identifiers, ColumnNames: yyDollar[4].insertColumnsUnion().Names} } yyVAL.union = yyLOCAL - case 909: + case 913: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *tree.MultiInsertTarget -//line mysql_sql.y:6389 +//line mysql_sql.y:6396 { yyLOCAL = &tree.MultiInsertTarget{Table: yyDollar[2].tableNameUnion(), Columns: yyDollar[4].insertColumnsUnion().Identifiers, ColumnNames: yyDollar[4].insertColumnsUnion().Names, Values: yyDollar[8].exprsUnion()} } yyVAL.union = yyLOCAL - case 910: + case 914: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6395 +//line mysql_sql.y:6402 { ins := yyDollar[4].insertUnion() if intoErr := tree.ValidateSelectIntoNotAllowed(ins.Rows); intoErr != "" { @@ -22459,10 +22559,10 @@ yydefault: yyLOCAL = ins } yyVAL.union = yyLOCAL - case 911: + case 915: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6418 +//line mysql_sql.y:6425 { ins := yyDollar[5].insertUnion() if intoErr := tree.ValidateSelectIntoNotAllowed(ins.Rows); intoErr != "" { @@ -22482,10 +22582,10 @@ yydefault: yyLOCAL = ins } yyVAL.union = yyLOCAL - case 912: + case 916: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6437 +//line mysql_sql.y:6444 { ins := yyDollar[5].insertUnion() if intoErr := tree.ValidateSelectIntoNotAllowed(ins.Rows); intoErr != "" { @@ -22506,10 +22606,10 @@ yydefault: yyLOCAL = ins } yyVAL.union = yyLOCAL - case 913: + case 917: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6457 +//line mysql_sql.y:6464 { ins := yyDollar[5].insertUnion() if intoErr := tree.ValidateSelectIntoNotAllowed(ins.Rows); intoErr != "" { @@ -22533,43 +22633,43 @@ yydefault: yyLOCAL = ins } yyVAL.union = yyLOCAL - case 914: + case 918: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.SelectExprs -//line mysql_sql.y:6481 +//line mysql_sql.y:6488 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 915: + case 919: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.SelectExprs -//line mysql_sql.y:6485 +//line mysql_sql.y:6492 { yyLOCAL = yyDollar[2].selectExprsUnion() } yyVAL.union = yyLOCAL - case 916: + case 920: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6491 +//line mysql_sql.y:6498 { yyLOCAL = yyDollar[1].mergeUnion() } yyVAL.union = yyLOCAL - case 917: + case 921: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:6495 +//line mysql_sql.y:6502 { yyDollar[2].mergeUnion().With = yyDollar[1].withClauseUnion() yyLOCAL = yyDollar[2].mergeUnion() } yyVAL.union = yyLOCAL - case 918: + case 922: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.Merge -//line mysql_sql.y:6502 +//line mysql_sql.y:6509 { yyLOCAL = &tree.Merge{ Target: yyDollar[3].tableExprUnion(), @@ -22579,10 +22679,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 919: + case 923: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *tree.Merge -//line mysql_sql.y:6511 +//line mysql_sql.y:6518 { yyLOCAL = &tree.Merge{ Target: yyDollar[3].tableExprUnion(), @@ -22593,26 +22693,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 920: + case 924: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.MergeClauses -//line mysql_sql.y:6523 +//line mysql_sql.y:6530 { yyLOCAL = tree.MergeClauses{yyDollar[1].mergeClauseUnion()} } yyVAL.union = yyLOCAL - case 921: + case 925: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.MergeClauses -//line mysql_sql.y:6527 +//line mysql_sql.y:6534 { yyLOCAL = append(yyDollar[1].mergeClausesUnion(), yyDollar[2].mergeClauseUnion()) } yyVAL.union = yyLOCAL - case 922: + case 926: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.MergeClause -//line mysql_sql.y:6533 +//line mysql_sql.y:6540 { yyLOCAL = &tree.MergeClause{ Matched: true, @@ -22622,10 +22722,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 923: + case 927: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.MergeClause -//line mysql_sql.y:6542 +//line mysql_sql.y:6549 { yyLOCAL = &tree.MergeClause{ Matched: true, @@ -22634,10 +22734,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 924: + case 928: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL *tree.MergeClause -//line mysql_sql.y:6550 +//line mysql_sql.y:6557 { yyLOCAL = &tree.MergeClause{ Matched: false, @@ -22648,10 +22748,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 925: + case 929: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL *tree.MergeClause -//line mysql_sql.y:6560 +//line mysql_sql.y:6567 { yyLOCAL = &tree.MergeClause{ Matched: false, @@ -22662,10 +22762,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 926: + case 930: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *tree.MergeClause -//line mysql_sql.y:6570 +//line mysql_sql.y:6577 { yyLOCAL = &tree.MergeClause{ Matched: false, @@ -22675,10 +22775,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 927: + case 931: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *tree.MergeClause -//line mysql_sql.y:6579 +//line mysql_sql.y:6586 { yyLOCAL = &tree.MergeClause{ Matched: false, @@ -22688,9 +22788,9 @@ yydefault: } } yyVAL.union = yyLOCAL - case 928: + case 932: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:6590 +//line mysql_sql.y:6597 { if !strings.EqualFold(yyDollar[1].cstrUnion().Origin(), "matched") { yylex.Error("expected MATCHED") @@ -22698,42 +22798,42 @@ yydefault: } yyVAL.str = yyDollar[1].cstrUnion().Origin() } - case 929: + case 933: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:6599 +//line mysql_sql.y:6606 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 930: + case 934: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:6603 +//line mysql_sql.y:6610 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 931: + case 935: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6609 +//line mysql_sql.y:6616 { yyLOCAL = tree.IdentifierList{tree.Identifier(yyDollar[1].str)} } yyVAL.union = yyLOCAL - case 932: + case 936: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6613 +//line mysql_sql.y:6620 { yyLOCAL = append(yyDollar[1].identifierListUnion(), tree.Identifier(yyDollar[3].str)) } yyVAL.union = yyLOCAL - case 933: + case 937: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Insert -//line mysql_sql.y:6619 +//line mysql_sql.y:6626 { vc := tree.NewValuesClause(yyDollar[2].rowsExprsUnion()) yyLOCAL = &tree.Insert{ @@ -22741,20 +22841,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 934: + case 938: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Insert -//line mysql_sql.y:6626 +//line mysql_sql.y:6633 { yyLOCAL = &tree.Insert{ Rows: yyDollar[1].selectUnion(), } } yyVAL.union = yyLOCAL - case 935: + case 939: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.Insert -//line mysql_sql.y:6632 +//line mysql_sql.y:6639 { vc := tree.NewValuesClause(yyDollar[5].rowsExprsUnion()) yyLOCAL = &tree.Insert{ @@ -22764,10 +22864,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 936: + case 940: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Insert -//line mysql_sql.y:6641 +//line mysql_sql.y:6648 { vc := tree.NewValuesClause(yyDollar[4].rowsExprsUnion()) yyLOCAL = &tree.Insert{ @@ -22775,10 +22875,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 937: + case 941: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Insert -//line mysql_sql.y:6648 +//line mysql_sql.y:6655 { yyLOCAL = &tree.Insert{ Columns: yyDollar[2].insertColumnsUnion().Identifiers, @@ -22787,10 +22887,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 938: + case 942: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Insert -//line mysql_sql.y:6656 +//line mysql_sql.y:6663 { if yyDollar[2].assignmentsUnion() == nil { yylex.Error("the set list of insert can not be empty") @@ -22812,66 +22912,66 @@ yydefault: } } yyVAL.union = yyLOCAL - case 939: + case 943: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:6678 +//line mysql_sql.y:6685 { yyLOCAL = []*tree.UpdateExpr{} } yyVAL.union = yyLOCAL - case 940: + case 944: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:6682 +//line mysql_sql.y:6689 { yyLOCAL = yyDollar[1].updateExprsUnion() } yyVAL.union = yyLOCAL - case 941: + case 945: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:6688 +//line mysql_sql.y:6695 { yyLOCAL = yyDollar[5].updateExprsUnion() } yyVAL.union = yyLOCAL - case 942: + case 946: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.UpdateExprs -//line mysql_sql.y:6692 +//line mysql_sql.y:6699 { yyLOCAL = []*tree.UpdateExpr{nil} } yyVAL.union = yyLOCAL - case 943: + case 947: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.Assignment -//line mysql_sql.y:6698 +//line mysql_sql.y:6705 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 944: + case 948: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.Assignment -//line mysql_sql.y:6702 +//line mysql_sql.y:6709 { yyLOCAL = []*tree.Assignment{yyDollar[1].assignmentUnion()} } yyVAL.union = yyLOCAL - case 945: + case 949: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.Assignment -//line mysql_sql.y:6706 +//line mysql_sql.y:6713 { yyLOCAL = append(yyDollar[1].assignmentsUnion(), yyDollar[3].assignmentUnion()) } yyVAL.union = yyLOCAL - case 946: + case 950: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Assignment -//line mysql_sql.y:6712 +//line mysql_sql.y:6719 { yyLOCAL = &tree.Assignment{ Column: tree.Identifier(yyDollar[1].unresolvedNameUnion().ColName()), @@ -22880,10 +22980,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 947: + case 951: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.InsertColumns -//line mysql_sql.y:6722 +//line mysql_sql.y:6729 { yyLOCAL = tree.InsertColumns{ Identifiers: tree.IdentifierList{tree.Identifier(yyDollar[1].unresolvedNameUnion().ColName())}, @@ -22891,236 +22991,236 @@ yydefault: } } yyVAL.union = yyLOCAL - case 948: + case 952: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.InsertColumns -//line mysql_sql.y:6729 +//line mysql_sql.y:6736 { yyLOCAL = yyDollar[1].insertColumnsUnion() yyLOCAL.Identifiers = append(yyDollar[1].insertColumnsUnion().Identifiers, tree.Identifier(yyDollar[3].unresolvedNameUnion().ColName())) yyLOCAL.Names = append(yyDollar[1].insertColumnsUnion().Names, yyDollar[3].unresolvedNameUnion()) } yyVAL.union = yyLOCAL - case 949: + case 953: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:6737 +//line mysql_sql.y:6744 { yyLOCAL = tree.NewUnresolvedName(yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin())) } yyVAL.union = yyLOCAL - case 950: + case 954: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:6741 +//line mysql_sql.y:6748 { tblName := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(tblName, yyDollar[3].cstrUnion()) } yyVAL.union = yyLOCAL - case 951: + case 955: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:6746 +//line mysql_sql.y:6753 { dbName := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) tblName := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[3].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(dbName, tblName, yyDollar[5].cstrUnion()) } yyVAL.union = yyLOCAL - case 952: + case 956: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6754 +//line mysql_sql.y:6761 { yyLOCAL = tree.IdentifierList{tree.Identifier(yyDollar[1].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 953: + case 957: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6758 +//line mysql_sql.y:6765 { yyLOCAL = tree.IdentifierList{tree.Identifier(yyDollar[3].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 954: + case 958: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6762 +//line mysql_sql.y:6769 { yyLOCAL = append(yyDollar[1].identifierListUnion(), tree.Identifier(yyDollar[3].cstrUnion().Compare())) } yyVAL.union = yyLOCAL - case 955: + case 959: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6766 +//line mysql_sql.y:6773 { yyLOCAL = append(yyDollar[1].identifierListUnion(), tree.Identifier(yyDollar[5].cstrUnion().Compare())) } yyVAL.union = yyLOCAL - case 956: + case 960: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.Exprs -//line mysql_sql.y:6772 +//line mysql_sql.y:6779 { yyLOCAL = []tree.Exprs{yyDollar[1].exprsUnion()} } yyVAL.union = yyLOCAL - case 957: + case 961: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.Exprs -//line mysql_sql.y:6776 +//line mysql_sql.y:6783 { yyLOCAL = append(yyDollar[1].rowsExprsUnion(), yyDollar[3].exprsUnion()) } yyVAL.union = yyLOCAL - case 958: + case 962: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:6782 +//line mysql_sql.y:6789 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 959: + case 963: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:6787 +//line mysql_sql.y:6794 { } - case 961: + case 965: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:6791 +//line mysql_sql.y:6798 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 963: + case 967: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:6798 +//line mysql_sql.y:6805 { yyLOCAL = tree.Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 964: + case 968: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:6802 +//line mysql_sql.y:6809 { yyLOCAL = append(yyDollar[1].exprsUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 966: + case 970: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:6809 +//line mysql_sql.y:6816 { yyLOCAL = &tree.DefaultVal{} } yyVAL.union = yyLOCAL - case 967: + case 971: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6814 +//line mysql_sql.y:6821 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 968: + case 972: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6818 +//line mysql_sql.y:6825 { yyLOCAL = yyDollar[3].identifierListUnion() } yyVAL.union = yyLOCAL - case 969: + case 973: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.InsertPartitionClause -//line mysql_sql.y:6823 +//line mysql_sql.y:6830 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 970: + case 974: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.InsertPartitionClause -//line mysql_sql.y:6827 +//line mysql_sql.y:6834 { yyLOCAL = &tree.InsertPartitionClause{Names: yyDollar[3].identifierListUnion()} } yyVAL.union = yyLOCAL - case 971: + case 975: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.InsertPartitionClause -//line mysql_sql.y:6831 +//line mysql_sql.y:6838 { yyLOCAL = &tree.InsertPartitionClause{Values: yyDollar[3].partitionValuesUnion()} } yyVAL.union = yyLOCAL - case 972: + case 976: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.PartitionValues -//line mysql_sql.y:6837 +//line mysql_sql.y:6844 { yyLOCAL = tree.PartitionValues{{Name: tree.Identifier(yyDollar[1].cstrUnion().Compare()), Expr: yyDollar[3].exprUnion()}} } yyVAL.union = yyLOCAL - case 973: + case 977: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.PartitionValues -//line mysql_sql.y:6841 +//line mysql_sql.y:6848 { yyLOCAL = append(yyDollar[1].partitionValuesUnion(), tree.PartitionValue{Name: tree.Identifier(yyDollar[3].cstrUnion().Compare()), Expr: yyDollar[5].exprUnion()}) } yyVAL.union = yyLOCAL - case 974: + case 978: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6847 +//line mysql_sql.y:6854 { yyLOCAL = tree.IdentifierList{tree.Identifier(yyDollar[1].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 975: + case 979: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:6851 +//line mysql_sql.y:6858 { yyLOCAL = append(yyDollar[1].identifierListUnion(), tree.Identifier(yyDollar[3].cstrUnion().Compare())) } yyVAL.union = yyLOCAL - case 976: + case 980: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:6857 +//line mysql_sql.y:6864 { yyLOCAL = yyDollar[2].tableNameUnion() } yyVAL.union = yyLOCAL - case 977: + case 981: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:6861 +//line mysql_sql.y:6868 { yyLOCAL = yyDollar[1].tableNameUnion() } yyVAL.union = yyLOCAL - case 978: + case 982: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.SelectInto -//line mysql_sql.y:6867 +//line mysql_sql.y:6874 { yyLOCAL = &tree.SelectInto{} } yyVAL.union = yyLOCAL - case 979: + case 983: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *tree.SelectInto -//line mysql_sql.y:6871 +//line mysql_sql.y:6878 { yyLOCAL = &tree.SelectInto{Export: &tree.ExportParam{ Outfile: true, @@ -23135,23 +23235,23 @@ yydefault: }} } yyVAL.union = yyLOCAL - case 980: + case 984: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.SelectInto -//line mysql_sql.y:6885 +//line mysql_sql.y:6892 { yyLOCAL = &tree.SelectInto{UserVars: yyDollar[2].varExprsUnion()} } yyVAL.union = yyLOCAL - case 981: + case 985: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:6890 +//line mysql_sql.y:6897 { yyVAL.str = "" } - case 982: + case 986: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:6894 +//line mysql_sql.y:6901 { str := strings.ToLower(yyDollar[2].str) if str != "csv" && str != "jsonline" && str != "parquet" { @@ -23160,18 +23260,18 @@ yydefault: } yyVAL.str = str } - case 983: + case 987: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:6904 +//line mysql_sql.y:6911 { yyLOCAL = uint64(0) } yyVAL.union = yyLOCAL - case 984: + case 988: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:6908 +//line mysql_sql.y:6915 { size, err := util.ParseDataSize(yyDollar[2].str) if err != nil { @@ -23181,10 +23281,10 @@ yydefault: yyLOCAL = size } yyVAL.union = yyLOCAL - case 985: + case 989: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:6918 +//line mysql_sql.y:6925 { yyLOCAL = &tree.Fields{ Terminated: &tree.Terminated{ @@ -23196,10 +23296,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 986: + case 990: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:6929 +//line mysql_sql.y:6936 { yyLOCAL = &tree.Fields{ Terminated: &tree.Terminated{ @@ -23211,10 +23311,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 987: + case 991: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:6940 +//line mysql_sql.y:6947 { str := yyDollar[7].str if str != "\\" && len(str) > 1 { @@ -23237,10 +23337,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 988: + case 992: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Fields -//line mysql_sql.y:6962 +//line mysql_sql.y:6969 { str := yyDollar[4].str if str != "\\" && len(str) > 1 { @@ -23263,10 +23363,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 989: + case 993: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Lines -//line mysql_sql.y:6985 +//line mysql_sql.y:6992 { yyLOCAL = &tree.Lines{ TerminatedBy: &tree.Terminated{ @@ -23275,10 +23375,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 990: + case 994: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Lines -//line mysql_sql.y:6993 +//line mysql_sql.y:7000 { yyLOCAL = &tree.Lines{ TerminatedBy: &tree.Terminated{ @@ -23287,18 +23387,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 991: + case 995: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:7002 +//line mysql_sql.y:7009 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 992: + case 996: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:7006 +//line mysql_sql.y:7013 { str := strings.ToLower(yyDollar[2].str) if str == "true" { @@ -23311,18 +23411,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 993: + case 997: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:7019 +//line mysql_sql.y:7026 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 994: + case 998: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:7023 +//line mysql_sql.y:7030 { value, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -23331,43 +23431,43 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 995: + case 999: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:7030 +//line mysql_sql.y:7037 { yyLOCAL = []string{} } yyVAL.union = yyLOCAL - case 996: + case 1000: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:7034 +//line mysql_sql.y:7041 { yyLOCAL = yyDollar[3].strsUnion() } yyVAL.union = yyLOCAL - case 997: + case 1001: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:7040 +//line mysql_sql.y:7047 { yyLOCAL = make([]string, 0, 4) yyLOCAL = append(yyLOCAL, yyDollar[1].cstrUnion().Compare()) } yyVAL.union = yyLOCAL - case 998: + case 1002: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:7045 +//line mysql_sql.y:7052 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].cstrUnion().Compare()) } yyVAL.union = yyLOCAL - case 999: + case 1003: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7054 +//line mysql_sql.y:7061 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23381,18 +23481,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1001: + case 1005: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7070 +//line mysql_sql.y:7077 { yyLOCAL = yyDollar[1].selectUnion() } yyVAL.union = yyLOCAL - case 1002: + case 1006: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7074 +//line mysql_sql.y:7081 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23406,26 +23506,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1003: + case 1007: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7094 +//line mysql_sql.y:7101 { yyLOCAL = yyDollar[1].selectUnion() } yyVAL.union = yyLOCAL - case 1004: + case 1008: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7098 +//line mysql_sql.y:7105 { yyLOCAL = tree.NewSelect(&tree.ValuesClause{Rows: yyDollar[2].rowsExprsUnion(), RowWord: true}, yyDollar[3].orderByUnion(), yyDollar[4].limitUnion()) } yyVAL.union = yyLOCAL - case 1005: + case 1009: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7104 +//line mysql_sql.y:7111 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23443,10 +23543,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1006: + case 1010: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7121 +//line mysql_sql.y:7128 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23464,10 +23564,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1007: + case 1011: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7138 +//line mysql_sql.y:7145 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23485,10 +23585,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1008: + case 1012: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7155 +//line mysql_sql.y:7162 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23506,10 +23606,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1009: + case 1013: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7172 +//line mysql_sql.y:7179 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23527,10 +23627,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1010: + case 1014: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7189 +//line mysql_sql.y:7196 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[1].selectStatementUnion()) if intoErr != "" { @@ -23548,10 +23648,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1011: + case 1015: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7206 +//line mysql_sql.y:7213 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[2].selectStatementUnion()) if intoErr != "" { @@ -23569,10 +23669,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1012: + case 1016: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7223 +//line mysql_sql.y:7230 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[2].selectStatementUnion()) if intoErr != "" { @@ -23590,10 +23690,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1013: + case 1017: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7240 +//line mysql_sql.y:7247 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[2].selectStatementUnion()) if intoErr != "" { @@ -23611,10 +23711,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1014: + case 1018: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7257 +//line mysql_sql.y:7264 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[2].selectStatementUnion()) if intoErr != "" { @@ -23632,10 +23732,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1015: + case 1019: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:7274 +//line mysql_sql.y:7281 { intoVars, deprecatedInto, intoErr := tree.SelectIntoVariablesForTopLevel(yyDollar[2].selectStatementUnion()) if intoErr != "" { @@ -23653,26 +23753,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1016: + case 1020: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.TimeWindow -//line mysql_sql.y:7292 +//line mysql_sql.y:7299 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1017: + case 1021: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.TimeWindow -//line mysql_sql.y:7296 +//line mysql_sql.y:7303 { yyLOCAL = yyDollar[1].timeWindowUnion() } yyVAL.union = yyLOCAL - case 1018: + case 1022: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.TimeWindow -//line mysql_sql.y:7302 +//line mysql_sql.y:7309 { yyLOCAL = &tree.TimeWindow{ Interval: yyDollar[1].timeIntervalUnion(), @@ -23682,10 +23782,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1019: + case 1023: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.Interval -//line mysql_sql.y:7313 +//line mysql_sql.y:7320 { str := fmt.Sprintf("%v", yyDollar[5].item) v, errStr := util.GetInt64(yyDollar[5].item) @@ -23700,18 +23800,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1020: + case 1024: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Sliding -//line mysql_sql.y:7328 +//line mysql_sql.y:7335 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1021: + case 1025: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.Sliding -//line mysql_sql.y:7332 +//line mysql_sql.y:7339 { str := fmt.Sprintf("%v", yyDollar[3].item) v, errStr := util.GetInt64(yyDollar[3].item) @@ -23725,44 +23825,44 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1022: + case 1026: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:7346 +//line mysql_sql.y:7353 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1023: + case 1027: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:7350 +//line mysql_sql.y:7357 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1024: + case 1028: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Fill -//line mysql_sql.y:7355 +//line mysql_sql.y:7362 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1025: + case 1029: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Fill -//line mysql_sql.y:7359 +//line mysql_sql.y:7366 { yyLOCAL = &tree.Fill{ Mode: yyDollar[3].fillModeUnion(), } } yyVAL.union = yyLOCAL - case 1026: + case 1030: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.Fill -//line mysql_sql.y:7365 +//line mysql_sql.y:7372 { yyLOCAL = &tree.Fill{ Mode: tree.FillValue, @@ -23770,50 +23870,50 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1027: + case 1031: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FillMode -//line mysql_sql.y:7374 +//line mysql_sql.y:7381 { yyLOCAL = tree.FillPrev } yyVAL.union = yyLOCAL - case 1028: + case 1032: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FillMode -//line mysql_sql.y:7378 +//line mysql_sql.y:7385 { yyLOCAL = tree.FillNext } yyVAL.union = yyLOCAL - case 1029: + case 1033: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FillMode -//line mysql_sql.y:7382 +//line mysql_sql.y:7389 { yyLOCAL = tree.FillNone } yyVAL.union = yyLOCAL - case 1030: + case 1034: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FillMode -//line mysql_sql.y:7386 +//line mysql_sql.y:7393 { yyLOCAL = tree.FillNull } yyVAL.union = yyLOCAL - case 1031: + case 1035: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FillMode -//line mysql_sql.y:7390 +//line mysql_sql.y:7397 { yyLOCAL = tree.FillLinear } yyVAL.union = yyLOCAL - case 1032: + case 1036: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.With -//line mysql_sql.y:7396 +//line mysql_sql.y:7403 { yyLOCAL = &tree.With{ IsRecursive: false, @@ -23821,10 +23921,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1033: + case 1037: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.With -//line mysql_sql.y:7403 +//line mysql_sql.y:7410 { yyLOCAL = &tree.With{ IsRecursive: true, @@ -23832,26 +23932,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1034: + case 1038: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.CTE -//line mysql_sql.y:7412 +//line mysql_sql.y:7419 { yyLOCAL = []*tree.CTE{yyDollar[1].cteUnion()} } yyVAL.union = yyLOCAL - case 1035: + case 1039: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.CTE -//line mysql_sql.y:7416 +//line mysql_sql.y:7423 { yyLOCAL = append(yyDollar[1].cteListUnion(), yyDollar[3].cteUnion()) } yyVAL.union = yyLOCAL - case 1036: + case 1040: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.CTE -//line mysql_sql.y:7422 +//line mysql_sql.y:7429 { yyLOCAL = &tree.CTE{ Name: &tree.AliasClause{Alias: tree.Identifier(yyDollar[1].cstrUnion().Compare()), Cols: yyDollar[2].identifierListUnion()}, @@ -23859,106 +23959,106 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1037: + case 1041: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:7430 +//line mysql_sql.y:7437 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1038: + case 1042: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:7434 +//line mysql_sql.y:7441 { yyLOCAL = yyDollar[2].identifierListUnion() } yyVAL.union = yyLOCAL - case 1039: + case 1043: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7439 +//line mysql_sql.y:7446 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1040: + case 1044: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7443 +//line mysql_sql.y:7450 { yyLOCAL = yyDollar[1].limitUnion() } yyVAL.union = yyLOCAL - case 1041: + case 1045: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7448 +//line mysql_sql.y:7455 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1042: + case 1046: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7452 +//line mysql_sql.y:7459 { yyLOCAL = yyDollar[1].limitUnion() } yyVAL.union = yyLOCAL - case 1043: + case 1047: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7456 +//line mysql_sql.y:7463 { yyLOCAL = yyDollar[1].limitUnion() } yyVAL.union = yyLOCAL - case 1044: + case 1048: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7462 +//line mysql_sql.y:7469 { yyLOCAL = &tree.Limit{Count: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1045: + case 1049: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7466 +//line mysql_sql.y:7473 { yyLOCAL = &tree.Limit{Offset: yyDollar[2].exprUnion(), Count: yyDollar[4].exprUnion()} } yyVAL.union = yyLOCAL - case 1046: + case 1050: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7470 +//line mysql_sql.y:7477 { yyLOCAL = &tree.Limit{Offset: yyDollar[4].exprUnion(), Count: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1047: + case 1051: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Limit -//line mysql_sql.y:7476 +//line mysql_sql.y:7483 { yyLOCAL = &tree.Limit{Offset: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1048: + case 1052: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.RankOption -//line mysql_sql.y:7481 +//line mysql_sql.y:7488 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1049: + case 1053: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.RankOption -//line mysql_sql.y:7485 +//line mysql_sql.y:7492 { // Parse option strings to extract key=value pairs into a map optionMap := make(map[string]string) @@ -23996,198 +24096,198 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1050: + case 1054: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.OrderBy -//line mysql_sql.y:7523 +//line mysql_sql.y:7530 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1051: + case 1055: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.OrderBy -//line mysql_sql.y:7527 +//line mysql_sql.y:7534 { yyLOCAL = yyDollar[1].orderByUnion() } yyVAL.union = yyLOCAL - case 1052: + case 1056: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.OrderBy -//line mysql_sql.y:7532 +//line mysql_sql.y:7539 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1053: + case 1057: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.OrderBy -//line mysql_sql.y:7536 +//line mysql_sql.y:7543 { yyLOCAL = yyDollar[4].orderByUnion() } yyVAL.union = yyLOCAL - case 1054: + case 1058: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.OrderBy -//line mysql_sql.y:7542 +//line mysql_sql.y:7549 { yyLOCAL = yyDollar[3].orderByUnion() } yyVAL.union = yyLOCAL - case 1055: + case 1059: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.OrderBy -//line mysql_sql.y:7548 +//line mysql_sql.y:7555 { yyLOCAL = tree.OrderBy{yyDollar[1].orderUnion()} } yyVAL.union = yyLOCAL - case 1056: + case 1060: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.OrderBy -//line mysql_sql.y:7552 +//line mysql_sql.y:7559 { yyLOCAL = append(yyDollar[1].orderByUnion(), yyDollar[3].orderUnion()) } yyVAL.union = yyLOCAL - case 1057: + case 1061: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Order -//line mysql_sql.y:7558 +//line mysql_sql.y:7565 { yyLOCAL = &tree.Order{Expr: yyDollar[1].exprUnion(), Direction: yyDollar[2].directionUnion(), NullsPosition: yyDollar[3].nullsPositionUnion()} } yyVAL.union = yyLOCAL - case 1058: + case 1062: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Direction -//line mysql_sql.y:7563 +//line mysql_sql.y:7570 { yyLOCAL = tree.DefaultDirection } yyVAL.union = yyLOCAL - case 1059: + case 1063: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Direction -//line mysql_sql.y:7567 +//line mysql_sql.y:7574 { yyLOCAL = tree.Ascending } yyVAL.union = yyLOCAL - case 1060: + case 1064: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Direction -//line mysql_sql.y:7571 +//line mysql_sql.y:7578 { yyLOCAL = tree.Descending } yyVAL.union = yyLOCAL - case 1061: + case 1065: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.NullsPosition -//line mysql_sql.y:7576 +//line mysql_sql.y:7583 { yyLOCAL = tree.DefaultNullsPosition } yyVAL.union = yyLOCAL - case 1062: + case 1066: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:7580 +//line mysql_sql.y:7587 { yylex.Error("NULLS FIRST is not supported in MySQL syntax") return 1 } - case 1063: + case 1067: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:7584 +//line mysql_sql.y:7591 { yylex.Error("NULLS LAST is not supported in MySQL syntax") return 1 } - case 1064: + case 1068: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.SelectLockInfo -//line mysql_sql.y:7589 +//line mysql_sql.y:7596 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1065: + case 1069: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.SelectLockInfo -//line mysql_sql.y:7593 +//line mysql_sql.y:7600 { yyLOCAL = &tree.SelectLockInfo{ LockType: tree.SelectLockForUpdate, } } yyVAL.union = yyLOCAL - case 1066: + case 1070: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.SelectLockInfo -//line mysql_sql.y:7599 +//line mysql_sql.y:7606 { yyLOCAL = &tree.SelectLockInfo{ LockType: tree.SelectLockForShare, } } yyVAL.union = yyLOCAL - case 1067: + case 1071: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.SelectLockInfo -//line mysql_sql.y:7605 +//line mysql_sql.y:7612 { yyLOCAL = &tree.SelectLockInfo{ LockType: tree.SelectLockForShare, } } yyVAL.union = yyLOCAL - case 1068: + case 1072: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7613 +//line mysql_sql.y:7620 { yyLOCAL = &tree.ParenSelect{Select: yyDollar[2].selectUnion()} } yyVAL.union = yyLOCAL - case 1069: + case 1073: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7617 +//line mysql_sql.y:7624 { yyLOCAL = &tree.ParenSelect{Select: &tree.Select{Select: yyDollar[2].selectStatementUnion()}} } yyVAL.union = yyLOCAL - case 1070: + case 1074: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7621 +//line mysql_sql.y:7628 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1071: + case 1075: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7625 +//line mysql_sql.y:7632 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1072: + case 1076: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7630 +//line mysql_sql.y:7637 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1073: + case 1077: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7634 +//line mysql_sql.y:7641 { yyLOCAL = &tree.UnionClause{ Type: yyDollar[2].unionTypeRecordUnion().Type, @@ -24198,10 +24298,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1074: + case 1078: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7644 +//line mysql_sql.y:7651 { yyLOCAL = &tree.UnionClause{ Type: yyDollar[2].unionTypeRecordUnion().Type, @@ -24212,10 +24312,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1075: + case 1079: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7654 +//line mysql_sql.y:7661 { yyLOCAL = &tree.UnionClause{ Type: yyDollar[2].unionTypeRecordUnion().Type, @@ -24226,10 +24326,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1076: + case 1080: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7664 +//line mysql_sql.y:7671 { yyLOCAL = &tree.UnionClause{ Type: yyDollar[2].unionTypeRecordUnion().Type, @@ -24240,170 +24340,170 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1077: + case 1081: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7674 +//line mysql_sql.y:7681 { yyLOCAL = &tree.UnionClause{Type: yyDollar[2].unionTypeRecordUnion().Type, Left: yyDollar[1].selectStatementUnion(), Right: yyDollar[3].selectStatementUnion(), All: yyDollar[2].unionTypeRecordUnion().All, Distinct: yyDollar[2].unionTypeRecordUnion().Distinct} } yyVAL.union = yyLOCAL - case 1078: + case 1082: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7678 +//line mysql_sql.y:7685 { yyLOCAL = &tree.UnionClause{Type: yyDollar[2].unionTypeRecordUnion().Type, Left: yyDollar[1].selectStatementUnion(), Right: yyDollar[3].selectStatementUnion(), All: yyDollar[2].unionTypeRecordUnion().All, Distinct: yyDollar[2].unionTypeRecordUnion().Distinct} } yyVAL.union = yyLOCAL - case 1079: + case 1083: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7682 +//line mysql_sql.y:7689 { yyLOCAL = &tree.UnionClause{Type: yyDollar[2].unionTypeRecordUnion().Type, Left: yyDollar[1].selectStatementUnion(), Right: yyDollar[3].selectStatementUnion(), All: yyDollar[2].unionTypeRecordUnion().All, Distinct: yyDollar[2].unionTypeRecordUnion().Distinct} } yyVAL.union = yyLOCAL - case 1080: + case 1084: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7686 +//line mysql_sql.y:7693 { yyLOCAL = &tree.UnionClause{Type: yyDollar[2].unionTypeRecordUnion().Type, Left: yyDollar[1].selectStatementUnion(), Right: yyDollar[3].selectStatementUnion(), All: yyDollar[2].unionTypeRecordUnion().All, Distinct: yyDollar[2].unionTypeRecordUnion().Distinct} } yyVAL.union = yyLOCAL - case 1081: + case 1085: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7694 +//line mysql_sql.y:7701 { yyLOCAL = &tree.ParenSelect{Select: tree.NewSelect(yyDollar[2].selectStatementUnion(), yyDollar[3].orderByUnion(), yyDollar[4].limitUnion())} } yyVAL.union = yyLOCAL - case 1082: + case 1086: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7700 +//line mysql_sql.y:7707 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1083: + case 1087: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7704 +//line mysql_sql.y:7711 { yyLOCAL = &tree.UnionClause{Type: yyDollar[2].unionTypeRecordUnion().Type, Left: yyDollar[1].selectStatementUnion(), Right: yyDollar[3].selectStatementUnion(), All: yyDollar[2].unionTypeRecordUnion().All, Distinct: yyDollar[2].unionTypeRecordUnion().Distinct} } yyVAL.union = yyLOCAL - case 1084: + case 1088: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7710 +//line mysql_sql.y:7717 { yyLOCAL = makeSelectStarFromTable(yyDollar[2].tableNameUnion()) } yyVAL.union = yyLOCAL - case 1085: + case 1089: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7715 +//line mysql_sql.y:7722 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1086: + case 1090: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7719 +//line mysql_sql.y:7726 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1087: + case 1091: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7723 +//line mysql_sql.y:7730 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1088: + case 1092: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7727 +//line mysql_sql.y:7734 { yyLOCAL = &tree.ValuesClause{Rows: yyDollar[2].rowsExprsUnion(), RowWord: true} } yyVAL.union = yyLOCAL - case 1089: + case 1093: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7733 +//line mysql_sql.y:7740 { yyLOCAL = &tree.ParenSelect{Select: tree.NewSelect(yyDollar[2].selectStatementUnion(), yyDollar[3].orderByUnion(), yyDollar[4].limitUnion())} } yyVAL.union = yyLOCAL - case 1090: + case 1094: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7739 +//line mysql_sql.y:7746 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1091: + case 1095: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7743 +//line mysql_sql.y:7750 { yyLOCAL = &tree.UnionClause{Type: yyDollar[2].unionTypeRecordUnion().Type, Left: yyDollar[1].selectStatementUnion(), Right: yyDollar[3].selectStatementUnion(), All: yyDollar[2].unionTypeRecordUnion().All, Distinct: yyDollar[2].unionTypeRecordUnion().Distinct} } yyVAL.union = yyLOCAL - case 1092: + case 1096: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7749 +//line mysql_sql.y:7756 { yyLOCAL = &tree.ValuesClause{Rows: yyDollar[2].rowsExprsUnion(), RowWord: true} } yyVAL.union = yyLOCAL - case 1093: + case 1097: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7755 +//line mysql_sql.y:7762 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1094: + case 1098: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7759 +//line mysql_sql.y:7766 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1095: + case 1099: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7763 +//line mysql_sql.y:7770 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1096: + case 1100: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7767 +//line mysql_sql.y:7774 { yyLOCAL = yyDollar[1].selectStatementUnion() } yyVAL.union = yyLOCAL - case 1097: + case 1101: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7773 +//line mysql_sql.y:7780 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.UNION, @@ -24412,10 +24512,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1098: + case 1102: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7781 +//line mysql_sql.y:7788 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.UNION, @@ -24424,10 +24524,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1099: + case 1103: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7789 +//line mysql_sql.y:7796 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.UNION, @@ -24436,10 +24536,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1100: + case 1104: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7798 +//line mysql_sql.y:7805 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.EXCEPT, @@ -24448,10 +24548,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1101: + case 1105: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7806 +//line mysql_sql.y:7813 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.EXCEPT, @@ -24460,10 +24560,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1102: + case 1106: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7814 +//line mysql_sql.y:7821 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.EXCEPT, @@ -24472,10 +24572,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1103: + case 1107: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7822 +//line mysql_sql.y:7829 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.INTERSECT, @@ -24484,10 +24584,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1104: + case 1108: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7830 +//line mysql_sql.y:7837 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.INTERSECT, @@ -24496,10 +24596,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1105: + case 1109: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7838 +//line mysql_sql.y:7845 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.INTERSECT, @@ -24508,10 +24608,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1106: + case 1110: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7846 +//line mysql_sql.y:7853 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.UT_MINUS, @@ -24520,10 +24620,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1107: + case 1111: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7854 +//line mysql_sql.y:7861 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.UT_MINUS, @@ -24532,10 +24632,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1108: + case 1112: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UnionTypeRecord -//line mysql_sql.y:7862 +//line mysql_sql.y:7869 { yyLOCAL = &tree.UnionTypeRecord{ Type: tree.UT_MINUS, @@ -24544,10 +24644,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1109: + case 1113: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.SelectStatement -//line mysql_sql.y:7872 +//line mysql_sql.y:7879 { yyLOCAL = &tree.SelectClause{ Distinct: tree.QuerySpecOptionDistinct&yyDollar[2].selectOptionsUnion() != 0, @@ -24563,146 +24663,146 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1110: + case 1114: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7889 +//line mysql_sql.y:7896 { yyLOCAL = tree.QuerySpecOptionNone } yyVAL.union = yyLOCAL - case 1111: + case 1115: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7893 +//line mysql_sql.y:7900 { yyLOCAL = yyDollar[1].selectOptionsUnion() } yyVAL.union = yyLOCAL - case 1112: + case 1116: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7899 +//line mysql_sql.y:7906 { yyLOCAL = yyDollar[1].selectOptionUnion() } yyVAL.union = yyLOCAL - case 1113: + case 1117: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7903 +//line mysql_sql.y:7910 { yyLOCAL = yyDollar[1].selectOptionsUnion() | yyDollar[2].selectOptionUnion() } yyVAL.union = yyLOCAL - case 1114: + case 1118: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7909 +//line mysql_sql.y:7916 { yyLOCAL = tree.QuerySpecOptionSqlSmallResult } yyVAL.union = yyLOCAL - case 1115: + case 1119: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7913 +//line mysql_sql.y:7920 { yyLOCAL = tree.QuerySpecOptionSqlBigResult } yyVAL.union = yyLOCAL - case 1116: + case 1120: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7917 +//line mysql_sql.y:7924 { yyLOCAL = tree.QuerySpecOptionSqlBufferResult } yyVAL.union = yyLOCAL - case 1117: + case 1121: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7921 +//line mysql_sql.y:7928 { yyLOCAL = tree.QuerySpecOptionStraightJoin } yyVAL.union = yyLOCAL - case 1118: + case 1122: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7925 +//line mysql_sql.y:7932 { yyLOCAL = tree.QuerySpecOptionHighPriority } yyVAL.union = yyLOCAL - case 1119: + case 1123: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7929 +//line mysql_sql.y:7936 { yyLOCAL = tree.QuerySpecOptionSqlCalcFoundRows } yyVAL.union = yyLOCAL - case 1120: + case 1124: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7933 +//line mysql_sql.y:7940 { yyLOCAL = tree.QuerySpecOptionSqlNoCache } yyVAL.union = yyLOCAL - case 1121: + case 1125: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7937 +//line mysql_sql.y:7944 { yyLOCAL = tree.QuerySpecOptionAll } yyVAL.union = yyLOCAL - case 1122: + case 1126: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7941 +//line mysql_sql.y:7948 { yyLOCAL = tree.QuerySpecOptionDistinct } yyVAL.union = yyLOCAL - case 1123: + case 1127: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL uint64 -//line mysql_sql.y:7945 +//line mysql_sql.y:7952 { yyLOCAL = tree.QuerySpecOptionDistinctRow } yyVAL.union = yyLOCAL - case 1124: + case 1128: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Where -//line mysql_sql.y:7967 +//line mysql_sql.y:7974 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1125: + case 1129: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Where -//line mysql_sql.y:7971 +//line mysql_sql.y:7978 { yyLOCAL = &tree.Where{Type: tree.AstHaving, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1126: + case 1130: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.GroupByClause -//line mysql_sql.y:7976 +//line mysql_sql.y:7983 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1127: + case 1131: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.GroupByClause -//line mysql_sql.y:7980 +//line mysql_sql.y:7987 { exprsList := []tree.Exprs{yyDollar[3].exprsUnion()} yyLOCAL = &tree.GroupByClause{ @@ -24713,10 +24813,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1128: + case 1132: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.GroupByClause -//line mysql_sql.y:7990 +//line mysql_sql.y:7997 { yyLOCAL = &tree.GroupByClause{ GroupByExprsList: yyDollar[6].rowsExprsUnion(), @@ -24727,10 +24827,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1129: + case 1133: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.GroupByClause -//line mysql_sql.y:8000 +//line mysql_sql.y:8007 { yyLOCAL = &tree.GroupByClause{ GroupByExprsList: []tree.Exprs{yyDollar[5].exprsUnion()}, @@ -24740,10 +24840,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1130: + case 1134: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.GroupByClause -//line mysql_sql.y:8009 +//line mysql_sql.y:8016 { yyLOCAL = &tree.GroupByClause{ GroupByExprsList: []tree.Exprs{yyDollar[5].exprsUnion()}, @@ -24753,106 +24853,106 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1131: + case 1135: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.Exprs -//line mysql_sql.y:8020 +//line mysql_sql.y:8027 { yyLOCAL = []tree.Exprs{yyDollar[2].exprsUnion()} } yyVAL.union = yyLOCAL - case 1132: + case 1136: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL []tree.Exprs -//line mysql_sql.y:8024 +//line mysql_sql.y:8031 { yyLOCAL = append(yyDollar[1].rowsExprsUnion(), yyDollar[4].exprsUnion()) } yyVAL.union = yyLOCAL - case 1133: + case 1137: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8030 +//line mysql_sql.y:8037 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1134: + case 1138: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8034 +//line mysql_sql.y:8041 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1135: + case 1139: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.Where -//line mysql_sql.y:8039 +//line mysql_sql.y:8046 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1136: + case 1140: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.Where -//line mysql_sql.y:8043 +//line mysql_sql.y:8050 { yyLOCAL = &tree.Where{Type: tree.AstWhere, Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1137: + case 1141: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectExprs -//line mysql_sql.y:8049 +//line mysql_sql.y:8056 { yyLOCAL = tree.SelectExprs{yyDollar[1].selectExprUnion()} } yyVAL.union = yyLOCAL - case 1138: + case 1142: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectExprs -//line mysql_sql.y:8053 +//line mysql_sql.y:8060 { yyLOCAL = append(yyDollar[1].selectExprsUnion(), yyDollar[3].selectExprUnion()) } yyVAL.union = yyLOCAL - case 1139: + case 1143: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.SelectExpr -//line mysql_sql.y:8059 +//line mysql_sql.y:8066 { yyLOCAL = tree.SelectExpr{Expr: tree.StarExpr()} } yyVAL.union = yyLOCAL - case 1140: + case 1144: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.SelectExpr -//line mysql_sql.y:8063 +//line mysql_sql.y:8070 { yyLOCAL = tree.SelectExpr{Expr: yyDollar[1].exprUnion(), As: yyDollar[2].cstrUnion()} } yyVAL.union = yyLOCAL - case 1141: + case 1145: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.SelectExpr -//line mysql_sql.y:8067 +//line mysql_sql.y:8074 { yyLOCAL = tree.SelectExpr{Expr: tree.NewUnresolvedNameWithStar(yyDollar[1].cstrUnion())} } yyVAL.union = yyLOCAL - case 1142: + case 1146: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.SelectExpr -//line mysql_sql.y:8071 +//line mysql_sql.y:8078 { yyLOCAL = tree.SelectExpr{Expr: tree.NewUnresolvedNameWithStar(yyDollar[1].cstrUnion(), yyDollar[3].cstrUnion())} } yyVAL.union = yyLOCAL - case 1143: + case 1147: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.From -//line mysql_sql.y:8076 +//line mysql_sql.y:8083 { prefix := tree.ObjectNamePrefix{ExplicitSchema: false} tn := tree.NewTableName(tree.Identifier(""), prefix, nil) @@ -24861,28 +24961,28 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1144: + case 1148: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.From -//line mysql_sql.y:8084 +//line mysql_sql.y:8091 { yyLOCAL = yyDollar[1].fromUnion() } yyVAL.union = yyLOCAL - case 1145: + case 1149: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.From -//line mysql_sql.y:8090 +//line mysql_sql.y:8097 { yyLOCAL = &tree.From{ Tables: tree.TableExprs{yyDollar[2].tableExprUnion()}, } } yyVAL.union = yyLOCAL - case 1146: + case 1150: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8098 +//line mysql_sql.y:8105 { if t, ok := yyDollar[1].tableExprUnion().(*tree.JoinTableExpr); ok { yyLOCAL = t @@ -24893,18 +24993,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1147: + case 1151: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8108 +//line mysql_sql.y:8115 { yyLOCAL = &tree.JoinTableExpr{Left: yyDollar[1].tableExprUnion(), Right: yyDollar[3].tableExprUnion(), JoinType: tree.JOIN_TYPE_CROSS} } yyVAL.union = yyLOCAL - case 1149: + case 1153: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8115 +//line mysql_sql.y:8122 { if !strings.EqualFold(yyDollar[2].str, "OJ") { yylex.Error("expected OJ in table reference escape") @@ -24913,26 +25013,26 @@ yydefault: yyLOCAL = yyDollar[3].tableExprUnion() } yyVAL.union = yyLOCAL - case 1151: + case 1155: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8126 +//line mysql_sql.y:8133 { yyLOCAL = yyDollar[1].joinTableExprUnion() } yyVAL.union = yyLOCAL - case 1152: + case 1156: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8130 +//line mysql_sql.y:8137 { yyLOCAL = yyDollar[1].applyTableExprUnion() } yyVAL.union = yyLOCAL - case 1153: + case 1157: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.JoinTableExpr -//line mysql_sql.y:8136 +//line mysql_sql.y:8143 { if strings.Contains(yyDollar[2].str, ":") { ss := strings.SplitN(yyDollar[2].str, ":", 2) @@ -24953,10 +25053,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1154: + case 1158: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.JoinTableExpr -//line mysql_sql.y:8156 +//line mysql_sql.y:8163 { yyLOCAL = &tree.JoinTableExpr{ Left: yyDollar[1].tableExprUnion(), @@ -24966,10 +25066,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1155: + case 1159: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.JoinTableExpr -//line mysql_sql.y:8165 +//line mysql_sql.y:8172 { if yyDollar[4].joinCondUnion() == nil { yylex.Error("outer join requires ON/USING clause") @@ -24983,10 +25083,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1156: + case 1160: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.JoinTableExpr -//line mysql_sql.y:8178 +//line mysql_sql.y:8185 { yyLOCAL = &tree.JoinTableExpr{ Left: yyDollar[1].tableExprUnion(), @@ -24995,10 +25095,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1157: + case 1161: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.JoinTableExpr -//line mysql_sql.y:8186 +//line mysql_sql.y:8193 { yyLOCAL = &tree.JoinTableExpr{ Left: yyDollar[1].tableExprUnion(), @@ -25008,10 +25108,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1158: + case 1162: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.JoinTableExpr -//line mysql_sql.y:8195 +//line mysql_sql.y:8202 { if !hasAsofLeftFactorAlias(yyDollar[1].tableExprUnion()) { yylex.Error("native ASOF JOIN requires an aliased left table factor") @@ -25026,10 +25126,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1159: + case 1163: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ApplyTableExpr -//line mysql_sql.y:8211 +//line mysql_sql.y:8218 { yyLOCAL = &tree.ApplyTableExpr{ Left: yyDollar[1].tableExprUnion(), @@ -25038,27 +25138,27 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1160: + case 1164: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8221 +//line mysql_sql.y:8228 { yyVAL.str = tree.APPLY_TYPE_CROSS } - case 1161: + case 1165: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8225 +//line mysql_sql.y:8232 { yyVAL.str = tree.APPLY_TYPE_OUTER } - case 1162: + case 1166: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8231 +//line mysql_sql.y:8238 { yyVAL.str = tree.JOIN_TYPE_NATURAL } - case 1163: + case 1167: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8235 +//line mysql_sql.y:8242 { switch yyDollar[2].str { case tree.JOIN_TYPE_LEFT: @@ -25069,86 +25169,86 @@ yydefault: yyVAL.str = tree.JOIN_TYPE_NATURAL_FULL } } - case 1164: + case 1168: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8248 +//line mysql_sql.y:8255 { yyVAL.str = tree.JOIN_TYPE_LEFT } - case 1165: + case 1169: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:8252 +//line mysql_sql.y:8259 { yyVAL.str = tree.JOIN_TYPE_LEFT } - case 1166: + case 1170: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8256 +//line mysql_sql.y:8263 { yyVAL.str = tree.JOIN_TYPE_RIGHT } - case 1167: + case 1171: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:8260 +//line mysql_sql.y:8267 { yyVAL.str = tree.JOIN_TYPE_RIGHT } - case 1168: + case 1172: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8264 +//line mysql_sql.y:8271 { yyVAL.str = tree.JOIN_TYPE_FULL } - case 1169: + case 1173: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:8268 +//line mysql_sql.y:8275 { yyVAL.str = tree.JOIN_TYPE_FULL } - case 1170: + case 1174: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8274 +//line mysql_sql.y:8281 { yyVAL.str = tree.JOIN_TYPE_DEDUP } - case 1171: + case 1175: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8280 +//line mysql_sql.y:8287 { yyVAL.str = tree.JOIN_TYPE_ASOF } - case 1172: + case 1176: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:8284 +//line mysql_sql.y:8291 { yyVAL.str = tree.JOIN_TYPE_ASOF_LEFT } - case 1173: + case 1177: yyDollar = yyS[yypt-4 : yypt+1] -//line mysql_sql.y:8288 +//line mysql_sql.y:8295 { yyVAL.str = tree.JOIN_TYPE_ASOF_LEFT } - case 1174: + case 1178: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:8293 +//line mysql_sql.y:8300 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1175: + case 1179: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:8297 +//line mysql_sql.y:8304 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1176: + case 1180: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8303 +//line mysql_sql.y:8310 { stmt := &tree.ValuesStatement{ Rows: yyDollar[2].rowsExprsUnion(), @@ -25162,132 +25262,132 @@ yydefault: yyLOCAL = stmt } yyVAL.union = yyLOCAL - case 1177: + case 1181: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.Exprs -//line mysql_sql.y:8318 +//line mysql_sql.y:8325 { yyLOCAL = []tree.Exprs{yyDollar[1].exprsUnion()} } yyVAL.union = yyLOCAL - case 1178: + case 1182: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.Exprs -//line mysql_sql.y:8322 +//line mysql_sql.y:8329 { yyLOCAL = append(yyDollar[1].rowsExprsUnion(), yyDollar[3].exprsUnion()) } yyVAL.union = yyLOCAL - case 1179: + case 1183: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:8328 +//line mysql_sql.y:8335 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 1180: + case 1184: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8334 +//line mysql_sql.y:8341 { yyVAL.str = yyDollar[1].str } - case 1181: + case 1185: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:8340 +//line mysql_sql.y:8347 { yyVAL.str = yyDollar[2].str } - case 1182: + case 1186: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8346 +//line mysql_sql.y:8353 { yyVAL.str = tree.JOIN_TYPE_STRAIGHT } - case 1183: + case 1187: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8352 +//line mysql_sql.y:8359 { yyVAL.str = tree.JOIN_TYPE_INNER } - case 1184: + case 1188: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8356 +//line mysql_sql.y:8363 { yyVAL.str = tree.JOIN_TYPE_INNER } - case 1185: + case 1189: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8360 +//line mysql_sql.y:8367 { yyVAL.str = tree.JOIN_TYPE_CROSS } - case 1186: + case 1190: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:8364 +//line mysql_sql.y:8371 { yyVAL.str = tree.JOIN_TYPE_CENTROIDX + ":" + yyDollar[2].str } - case 1187: + case 1191: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.JoinCond -//line mysql_sql.y:8370 +//line mysql_sql.y:8377 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1188: + case 1192: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.JoinCond -//line mysql_sql.y:8374 +//line mysql_sql.y:8381 { yyLOCAL = yyDollar[1].joinCondUnion() } yyVAL.union = yyLOCAL - case 1189: + case 1193: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.JoinCond -//line mysql_sql.y:8380 +//line mysql_sql.y:8387 { yyLOCAL = &tree.OnJoinCond{Expr: yyDollar[2].exprUnion()} } yyVAL.union = yyLOCAL - case 1190: + case 1194: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.JoinCond -//line mysql_sql.y:8384 +//line mysql_sql.y:8391 { yyLOCAL = &tree.UsingJoinCond{Cols: yyDollar[3].identifierListUnion()} } yyVAL.union = yyLOCAL - case 1191: + case 1195: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:8390 +//line mysql_sql.y:8397 { yyLOCAL = tree.IdentifierList{tree.Identifier(yyDollar[1].cstrUnion().Compare())} } yyVAL.union = yyLOCAL - case 1192: + case 1196: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:8394 +//line mysql_sql.y:8401 { yyLOCAL = append(yyDollar[1].identifierListUnion(), tree.Identifier(yyDollar[3].cstrUnion().Compare())) } yyVAL.union = yyLOCAL - case 1193: + case 1197: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8400 +//line mysql_sql.y:8407 { yyLOCAL = yyDollar[1].aliasedTableExprUnion() } yyVAL.union = yyLOCAL - case 1194: + case 1198: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8404 +//line mysql_sql.y:8411 { yyLOCAL = &tree.AliasedTableExpr{ Expr: yyDollar[1].parenTableExprUnion(), @@ -25298,10 +25398,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1195: + case 1199: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8414 +//line mysql_sql.y:8421 { if yyDollar[2].str != "" { yyLOCAL = &tree.AliasedTableExpr{ @@ -25315,26 +25415,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1196: + case 1200: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8427 +//line mysql_sql.y:8434 { yyLOCAL = yyDollar[2].tableExprUnion() } yyVAL.union = yyLOCAL - case 1197: + case 1201: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.ParenTableExpr -//line mysql_sql.y:8435 +//line mysql_sql.y:8442 { yyLOCAL = &tree.ParenTableExpr{Expr: yyDollar[1].selectStatementUnion().(*tree.ParenSelect).Select} } yyVAL.union = yyLOCAL - case 1198: + case 1202: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8441 +//line mysql_sql.y:8448 { name := tree.NewUnresolvedName(tree.NewCStr("json_table", 1)) yyLOCAL = &tree.TableFunction{ @@ -25343,10 +25443,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1199: + case 1203: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableExpr -//line mysql_sql.y:8450 +//line mysql_sql.y:8457 { name := tree.NewUnresolvedName(yyDollar[1].cstrUnion()) yyLOCAL = &tree.TableFunction{ @@ -25359,34 +25459,34 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1200: + case 1204: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.JSONTableColumn -//line mysql_sql.y:8464 +//line mysql_sql.y:8471 { yyLOCAL = []*tree.JSONTableColumn{yyDollar[1].jsonTableColumnUnion()} } yyVAL.union = yyLOCAL - case 1201: + case 1205: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.JSONTableColumn -//line mysql_sql.y:8466 +//line mysql_sql.y:8473 { yyLOCAL = append(yyDollar[1].jsonTableColumnsUnion(), yyDollar[3].jsonTableColumnUnion()) } yyVAL.union = yyLOCAL - case 1202: + case 1206: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.JSONTableColumn -//line mysql_sql.y:8470 +//line mysql_sql.y:8477 { yyLOCAL = &tree.JSONTableColumn{Name: yyDollar[1].cstrUnion().Origin(), Kind: "ordinality"} } yyVAL.union = yyLOCAL - case 1203: + case 1207: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.JSONTableColumn -//line mysql_sql.y:8472 +//line mysql_sql.y:8479 { yyLOCAL = yyDollar[5].jsonTableColumnUnion() yyLOCAL.Name = yyDollar[1].cstrUnion().Origin() @@ -25395,118 +25495,118 @@ yydefault: yyLOCAL.Path = yyDollar[4].str } yyVAL.union = yyLOCAL - case 1204: + case 1208: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.JSONTableColumn -//line mysql_sql.y:8474 +//line mysql_sql.y:8481 { yyLOCAL = &tree.JSONTableColumn{Name: yyDollar[1].cstrUnion().Origin(), Kind: "exists", Type: yyDollar[2].columnTypeUnion(), Path: yyDollar[5].str} } yyVAL.union = yyLOCAL - case 1205: + case 1209: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.JSONTableColumn -//line mysql_sql.y:8476 +//line mysql_sql.y:8483 { yyLOCAL = &tree.JSONTableColumn{Kind: "nested", Path: yyDollar[3].str, Children: yyDollar[6].jsonTableColumnsUnion()} } yyVAL.union = yyLOCAL - case 1206: + case 1210: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:8479 +//line mysql_sql.y:8486 { yyVAL.str = "" } - case 1207: + case 1211: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8481 +//line mysql_sql.y:8488 { yyVAL.str = yyDollar[1].str } - case 1208: + case 1212: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.JSONTableResponse -//line mysql_sql.y:8485 +//line mysql_sql.y:8492 { yyLOCAL = &tree.JSONTableResponse{Action: "null"} } yyVAL.union = yyLOCAL - case 1209: + case 1213: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.JSONTableResponse -//line mysql_sql.y:8487 +//line mysql_sql.y:8494 { yyLOCAL = &tree.JSONTableResponse{Action: "error"} } yyVAL.union = yyLOCAL - case 1210: + case 1214: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.JSONTableResponse -//line mysql_sql.y:8489 +//line mysql_sql.y:8496 { yyLOCAL = &tree.JSONTableResponse{Action: "default", Default: yyDollar[2].str} } yyVAL.union = yyLOCAL - case 1211: + case 1215: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.JSONTableColumn -//line mysql_sql.y:8492 +//line mysql_sql.y:8499 { yyLOCAL = &tree.JSONTableColumn{} } yyVAL.union = yyLOCAL - case 1212: + case 1216: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.JSONTableColumn -//line mysql_sql.y:8494 +//line mysql_sql.y:8501 { yyLOCAL = &tree.JSONTableColumn{OnEmpty: yyDollar[1].jsonTableResponseUnion(), OnError: yyDollar[4].jsonTableResponseUnion()} } yyVAL.union = yyLOCAL - case 1213: + case 1217: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.JSONTableColumn -//line mysql_sql.y:8496 +//line mysql_sql.y:8503 { yyLOCAL = &tree.JSONTableColumn{OnEmpty: yyDollar[4].jsonTableResponseUnion(), OnError: yyDollar[1].jsonTableResponseUnion(), ReversePolicies: yyDollar[4].jsonTableResponseUnion() != nil} } yyVAL.union = yyLOCAL - case 1214: + case 1218: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.JSONTableResponse -//line mysql_sql.y:8499 +//line mysql_sql.y:8506 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1215: + case 1219: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.JSONTableResponse -//line mysql_sql.y:8501 +//line mysql_sql.y:8508 { yyLOCAL = yyDollar[1].jsonTableResponseUnion() } yyVAL.union = yyLOCAL - case 1216: + case 1220: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.JSONTableResponse -//line mysql_sql.y:8504 +//line mysql_sql.y:8511 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1217: + case 1221: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.JSONTableResponse -//line mysql_sql.y:8506 +//line mysql_sql.y:8513 { yyLOCAL = yyDollar[1].jsonTableResponseUnion() } yyVAL.union = yyLOCAL - case 1218: + case 1222: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.AliasedTableExpr -//line mysql_sql.y:8510 +//line mysql_sql.y:8517 { yyLOCAL = &tree.AliasedTableExpr{ Expr: yyDollar[1].tableNameUnion(), @@ -25517,34 +25617,34 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1219: + case 1223: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.IndexHint -//line mysql_sql.y:8521 +//line mysql_sql.y:8528 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1221: + case 1225: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.IndexHint -//line mysql_sql.y:8528 +//line mysql_sql.y:8535 { yyLOCAL = []*tree.IndexHint{yyDollar[1].indexHintUnion()} } yyVAL.union = yyLOCAL - case 1222: + case 1226: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.IndexHint -//line mysql_sql.y:8532 +//line mysql_sql.y:8539 { yyLOCAL = append(yyDollar[1].indexHintListUnion(), yyDollar[2].indexHintUnion()) } yyVAL.union = yyLOCAL - case 1223: + case 1227: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.IndexHint -//line mysql_sql.y:8538 +//line mysql_sql.y:8545 { yyLOCAL = &tree.IndexHint{ IndexNames: yyDollar[4].strsUnion(), @@ -25553,182 +25653,182 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1224: + case 1228: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexHintType -//line mysql_sql.y:8548 +//line mysql_sql.y:8555 { yyLOCAL = tree.HintUse } yyVAL.union = yyLOCAL - case 1225: + case 1229: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexHintType -//line mysql_sql.y:8552 +//line mysql_sql.y:8559 { yyLOCAL = tree.HintIgnore } yyVAL.union = yyLOCAL - case 1226: + case 1230: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexHintType -//line mysql_sql.y:8556 +//line mysql_sql.y:8563 { yyLOCAL = tree.HintForce } yyVAL.union = yyLOCAL - case 1227: + case 1231: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IndexHintScope -//line mysql_sql.y:8561 +//line mysql_sql.y:8568 { yyLOCAL = tree.HintForScan } yyVAL.union = yyLOCAL - case 1228: + case 1232: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexHintScope -//line mysql_sql.y:8565 +//line mysql_sql.y:8572 { yyLOCAL = tree.HintForJoin } yyVAL.union = yyLOCAL - case 1229: + case 1233: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IndexHintScope -//line mysql_sql.y:8569 +//line mysql_sql.y:8576 { yyLOCAL = tree.HintForOrderBy } yyVAL.union = yyLOCAL - case 1230: + case 1234: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IndexHintScope -//line mysql_sql.y:8573 +//line mysql_sql.y:8580 { yyLOCAL = tree.HintForGroupBy } yyVAL.union = yyLOCAL - case 1231: + case 1235: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:8578 +//line mysql_sql.y:8585 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1232: + case 1236: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:8582 +//line mysql_sql.y:8589 { yyLOCAL = []string{yyDollar[1].cstrUnion().Compare()} } yyVAL.union = yyLOCAL - case 1233: + case 1237: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:8586 +//line mysql_sql.y:8593 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].cstrUnion().Compare()) } yyVAL.union = yyLOCAL - case 1234: + case 1238: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:8590 +//line mysql_sql.y:8597 { yyLOCAL = []string{yyDollar[1].str} } yyVAL.union = yyLOCAL - case 1235: + case 1239: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:8594 +//line mysql_sql.y:8601 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1236: + case 1240: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:8600 +//line mysql_sql.y:8607 { yyVAL.str = "" } - case 1237: + case 1241: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8604 +//line mysql_sql.y:8611 { yyVAL.str = yyDollar[1].str } - case 1238: + case 1242: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8608 +//line mysql_sql.y:8615 { yyVAL.str = yyDollar[2].str } - case 1239: + case 1243: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8614 +//line mysql_sql.y:8621 { yyVAL.str = yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) } - case 1240: + case 1244: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8618 +//line mysql_sql.y:8625 { yyVAL.str = yylex.(*Lexer).GetDbOrTblName(yyDollar[1].str) } - case 1241: + case 1245: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:8624 +//line mysql_sql.y:8631 { yyLOCAL = tree.NewCStr("", 1) } yyVAL.union = yyLOCAL - case 1242: + case 1246: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:8628 +//line mysql_sql.y:8635 { yyLOCAL = yyDollar[1].cstrUnion() } yyVAL.union = yyLOCAL - case 1243: + case 1247: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:8632 +//line mysql_sql.y:8639 { yyLOCAL = yyDollar[2].cstrUnion() } yyVAL.union = yyLOCAL - case 1244: + case 1248: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:8636 +//line mysql_sql.y:8643 { yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1245: + case 1249: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:8640 +//line mysql_sql.y:8647 { yyLOCAL = tree.NewCStr(yyDollar[2].str, 1) } yyVAL.union = yyLOCAL - case 1246: + case 1250: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8646 +//line mysql_sql.y:8653 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1270: + case 1275: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8689 +//line mysql_sql.y:8697 { yyLOCAL = &tree.CreateIcebergCatalog{ IfNotExists: yyDollar[4].ifNotExistsUnion(), @@ -25737,10 +25837,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1271: + case 1276: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8699 +//line mysql_sql.y:8707 { yyLOCAL = &tree.CreateMongoDBConnection{ IfNotExists: yyDollar[4].ifNotExistsUnion(), @@ -25749,10 +25849,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1272: + case 1277: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8709 +//line mysql_sql.y:8717 { cronExpr := "" timezone := "" @@ -25772,18 +25872,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1273: + case 1278: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.SQLTaskSchedule -//line mysql_sql.y:8729 +//line mysql_sql.y:8737 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1274: + case 1279: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.SQLTaskSchedule -//line mysql_sql.y:8733 +//line mysql_sql.y:8741 { yyLOCAL = &tree.SQLTaskSchedule{ CronExpr: yyDollar[2].str, @@ -25791,82 +25891,82 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1275: + case 1280: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:8741 +//line mysql_sql.y:8749 { yyVAL.str = "" } - case 1276: + case 1281: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8745 +//line mysql_sql.y:8753 { yyVAL.str = yyDollar[2].str } - case 1277: + case 1282: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:8750 +//line mysql_sql.y:8758 { yyLOCAL = tree.Expr(nil) } yyVAL.union = yyLOCAL - case 1278: + case 1283: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:8754 +//line mysql_sql.y:8762 { yyLOCAL = yyDollar[3].exprUnion() } yyVAL.union = yyLOCAL - case 1279: + case 1284: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:8760 +//line mysql_sql.y:8768 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1280: + case 1285: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:8764 +//line mysql_sql.y:8772 { yyLOCAL = tree.NewSubquery(yyDollar[1].selectUnion(), false) } yyVAL.union = yyLOCAL - case 1281: + case 1286: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:8769 +//line mysql_sql.y:8777 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1282: + case 1287: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:8773 +//line mysql_sql.y:8781 { yyLOCAL = sqlTaskInt64(yyDollar[2].item) } yyVAL.union = yyLOCAL - case 1283: + case 1288: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:8778 +//line mysql_sql.y:8786 { yyVAL.str = "" } - case 1284: + case 1289: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8782 +//line mysql_sql.y:8790 { yyVAL.str = yyDollar[2].str } - case 1285: + case 1290: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8788 +//line mysql_sql.y:8796 { var Language = yyDollar[3].str var Name = tree.Identifier(yyDollar[5].str) @@ -25878,135 +25978,135 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1286: + case 1291: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8801 +//line mysql_sql.y:8809 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1287: + case 1292: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8807 +//line mysql_sql.y:8815 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1288: + case 1293: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8813 +//line mysql_sql.y:8821 { yyLOCAL = tree.NewCreateProcedure( yyDollar[2].sourceOptionalUnion(), yyDollar[4].procNameUnion(), yyDollar[6].procArgsUnion(), yyDollar[8].str, yyDollar[9].str, ) } yyVAL.union = yyLOCAL - case 1289: + case 1294: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.ProcedureName -//line mysql_sql.y:8821 +//line mysql_sql.y:8829 { prefix := tree.ObjectNamePrefix{ExplicitSchema: false} yyLOCAL = tree.NewProcedureName(tree.Identifier(yyDollar[1].cstrUnion().Compare()), prefix) } yyVAL.union = yyLOCAL - case 1290: + case 1295: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ProcedureName -//line mysql_sql.y:8826 +//line mysql_sql.y:8834 { dbName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) prefix := tree.ObjectNamePrefix{SchemaName: tree.Identifier(dbName), ExplicitSchema: true} yyLOCAL = tree.NewProcedureName(tree.Identifier(yyDollar[3].cstrUnion().Compare()), prefix) } yyVAL.union = yyLOCAL - case 1291: + case 1296: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.ProcedureArgs -//line mysql_sql.y:8833 +//line mysql_sql.y:8841 { yyLOCAL = tree.ProcedureArgs(nil) } yyVAL.union = yyLOCAL - case 1293: + case 1298: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ProcedureArgs -//line mysql_sql.y:8840 +//line mysql_sql.y:8848 { yyLOCAL = tree.ProcedureArgs{yyDollar[1].procArgUnion()} } yyVAL.union = yyLOCAL - case 1294: + case 1299: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ProcedureArgs -//line mysql_sql.y:8844 +//line mysql_sql.y:8852 { yyLOCAL = append(yyDollar[1].procArgsUnion(), yyDollar[3].procArgUnion()) } yyVAL.union = yyLOCAL - case 1295: + case 1300: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ProcedureArg -//line mysql_sql.y:8850 +//line mysql_sql.y:8858 { yyLOCAL = tree.ProcedureArg(yyDollar[1].procArgDeclUnion()) } yyVAL.union = yyLOCAL - case 1296: + case 1301: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ProcedureArgDecl -//line mysql_sql.y:8856 +//line mysql_sql.y:8864 { yyLOCAL = tree.NewProcedureArgDecl(yyDollar[1].procArgTypeUnion(), yyDollar[2].unresolvedNameUnion(), yyDollar[3].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1297: + case 1302: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.InOutArgType -//line mysql_sql.y:8861 +//line mysql_sql.y:8869 { yyLOCAL = tree.TYPE_IN } yyVAL.union = yyLOCAL - case 1298: + case 1303: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.InOutArgType -//line mysql_sql.y:8865 +//line mysql_sql.y:8873 { yyLOCAL = tree.TYPE_IN } yyVAL.union = yyLOCAL - case 1299: + case 1304: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.InOutArgType -//line mysql_sql.y:8869 +//line mysql_sql.y:8877 { yyLOCAL = tree.TYPE_OUT } yyVAL.union = yyLOCAL - case 1300: + case 1305: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.InOutArgType -//line mysql_sql.y:8873 +//line mysql_sql.y:8881 { yyLOCAL = tree.TYPE_INOUT } yyVAL.union = yyLOCAL - case 1301: + case 1306: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:8878 +//line mysql_sql.y:8886 { yyVAL.str = "sql" } - case 1302: + case 1307: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8882 +//line mysql_sql.y:8890 { yyVAL.str = yyDollar[2].str } - case 1303: + case 1308: yyDollar = yyS[yypt-14 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:8888 +//line mysql_sql.y:8896 { if yyDollar[13].str == "" { yylex.Error("no function body error") @@ -26038,127 +26138,236 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1304: + case 1309: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.FunctionName -//line mysql_sql.y:8921 +//line mysql_sql.y:8929 { prefix := tree.ObjectNamePrefix{ExplicitSchema: false} yyLOCAL = tree.NewFuncName(tree.Identifier(yyDollar[1].cstrUnion().Compare()), prefix) } yyVAL.union = yyLOCAL - case 1305: + case 1310: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.FunctionName -//line mysql_sql.y:8926 +//line mysql_sql.y:8934 { dbName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) prefix := tree.ObjectNamePrefix{SchemaName: tree.Identifier(dbName), ExplicitSchema: true} yyLOCAL = tree.NewFuncName(tree.Identifier(yyDollar[3].cstrUnion().Compare()), prefix) } yyVAL.union = yyLOCAL - case 1306: + case 1311: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.FunctionArgs -//line mysql_sql.y:8933 +//line mysql_sql.y:8941 { yyLOCAL = tree.FunctionArgs(nil) } yyVAL.union = yyLOCAL - case 1308: + case 1313: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FunctionArgs -//line mysql_sql.y:8940 +//line mysql_sql.y:8948 { yyLOCAL = tree.FunctionArgs{yyDollar[1].funcArgUnion()} } yyVAL.union = yyLOCAL - case 1309: + case 1314: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.FunctionArgs -//line mysql_sql.y:8944 +//line mysql_sql.y:8952 { yyLOCAL = append(yyDollar[1].funcArgsUnion(), yyDollar[3].funcArgUnion()) } yyVAL.union = yyLOCAL - case 1310: + case 1315: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FunctionArg -//line mysql_sql.y:8950 +//line mysql_sql.y:8958 { yyLOCAL = tree.FunctionArg(yyDollar[1].funcArgDeclUnion()) } yyVAL.union = yyLOCAL - case 1311: + case 1316: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.FunctionArgDecl -//line mysql_sql.y:8956 +//line mysql_sql.y:8964 { yyLOCAL = tree.NewFunctionArgDecl(nil, yyDollar[1].columnTypeUnion(), nil) } yyVAL.union = yyLOCAL - case 1312: + case 1317: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FunctionArgDecl -//line mysql_sql.y:8960 +//line mysql_sql.y:8968 { yyLOCAL = tree.NewFunctionArgDecl(yyDollar[1].unresolvedNameUnion(), yyDollar[2].columnTypeUnion(), nil) } yyVAL.union = yyLOCAL - case 1313: + case 1318: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FunctionArgDecl -//line mysql_sql.y:8964 +//line mysql_sql.y:8972 { yyLOCAL = tree.NewFunctionArgDecl(yyDollar[1].unresolvedNameUnion(), yyDollar[2].columnTypeUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 1314: + case 1319: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:8970 +//line mysql_sql.y:8978 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1315: + case 1320: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.ReturnType -//line mysql_sql.y:8976 +//line mysql_sql.y:8984 { yyLOCAL = tree.NewReturnType(yyDollar[1].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1316: + case 1321: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8982 +//line mysql_sql.y:8990 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1317: + case 1322: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:8986 +//line mysql_sql.y:8994 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1318: + case 1323: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:8991 +//line mysql_sql.y:8999 { yyVAL.str = "" } - case 1320: + case 1325: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:8998 +//line mysql_sql.y:9006 { yyVAL.str = yyDollar[2].str } - case 1321: + case 1326: + yyDollar = yyS[yypt-8 : yypt+1] + var yyLOCAL tree.Statement +//line mysql_sql.y:9013 + { + yyLOCAL = &tree.CreateMaterializedView{Name: yyDollar[5].tableNameUnion(), IfNotExists: yyDollar[4].ifNotExistsUnion(), IntervalSeconds: yyDollar[6].int64ValUnion(), AsSource: yyDollar[8].selectUnion()} + } + yyVAL.union = yyLOCAL + case 1327: + yyDollar = yyS[yypt-2 : yypt+1] + var yyLOCAL int64 +//line mysql_sql.y:9016 + { + yyLOCAL = 0 + } + yyVAL.union = yyLOCAL + case 1328: + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL int64 +//line mysql_sql.y:9018 + { + n := sqlTaskInt64(yyDollar[4].item) + if n <= 0 || n > 31536000/yyDollar[5].int64ValUnion() { + yylex.Error("invalid materialized view refresh interval") + goto ret1 + } + yyLOCAL = n * yyDollar[5].int64ValUnion() + } + yyVAL.union = yyLOCAL + case 1329: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL int64 +//line mysql_sql.y:9025 + { + yyLOCAL = 1 + } + yyVAL.union = yyLOCAL + case 1330: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL int64 +//line mysql_sql.y:9026 + { + yyLOCAL = 60 + } + yyVAL.union = yyLOCAL + case 1331: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL int64 +//line mysql_sql.y:9027 + { + yyLOCAL = 3600 + } + yyVAL.union = yyLOCAL + case 1332: + yyDollar = yyS[yypt-1 : yypt+1] + var yyLOCAL int64 +//line mysql_sql.y:9028 + { + yyLOCAL = 86400 + } + yyVAL.union = yyLOCAL + case 1333: + yyDollar = yyS[yypt-4 : yypt+1] + var yyLOCAL tree.Statement +//line mysql_sql.y:9031 + { + yyLOCAL = &tree.RefreshMaterializedView{Name: yyDollar[4].tableNameUnion()} + } + yyVAL.union = yyLOCAL + case 1334: + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL tree.Statement +//line mysql_sql.y:9034 + { + yyLOCAL = &tree.DropMaterializedView{Name: yyDollar[5].tableNameUnion(), IfExists: yyDollar[4].boolValUnion()} + } + yyVAL.union = yyLOCAL + case 1335: + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL tree.Statement +//line mysql_sql.y:9037 + { + yyLOCAL = &tree.AlterMaterializedView{Name: yyDollar[4].tableNameUnion(), IntervalSeconds: yyDollar[5].int64ValUnion()} + } + yyVAL.union = yyLOCAL + case 1336: + yyDollar = yyS[yypt-3 : yypt+1] + var yyLOCAL tree.Statement +//line mysql_sql.y:9040 + { + yyLOCAL = &tree.ShowMaterializedViews{} + } + yyVAL.union = yyLOCAL + case 1337: + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL tree.Statement +//line mysql_sql.y:9041 + { + yyLOCAL = &tree.ShowMaterializedViews{Name: yyDollar[5].tableNameUnion(), Runs: true} + } + yyVAL.union = yyLOCAL + case 1338: + yyDollar = yyS[yypt-5 : yypt+1] + var yyLOCAL tree.Statement +//line mysql_sql.y:9042 + { + yyLOCAL = &tree.ShowMaterializedViews{Name: yyDollar[5].tableNameUnion(), Create: true} + } + yyVAL.union = yyLOCAL + case 1339: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9004 +//line mysql_sql.y:9046 { var Replace bool var Name = yyDollar[5].tableNameUnion() @@ -26178,10 +26387,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1322: + case 1340: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9023 +//line mysql_sql.y:9065 { var Replace = yyDollar[2].sourceOptionalUnion() var Name = yyDollar[5].tableNameUnion() @@ -26201,10 +26410,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1323: + case 1341: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9044 +//line mysql_sql.y:9086 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Name = yyDollar[4].exprUnion() @@ -26220,10 +26429,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1324: + case 1342: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9059 +//line mysql_sql.y:9101 { var FromUri = yyDollar[4].str var SubscriptionAccountName = yyDollar[5].cstrUnion().Compare() @@ -26241,81 +26450,81 @@ yydefault: yyLOCAL = cs } yyVAL.union = yyLOCAL - case 1325: + case 1343: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:9078 +//line mysql_sql.y:9120 { yyVAL.str = yyDollar[1].str } - case 1326: + case 1344: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:9082 +//line mysql_sql.y:9124 { yyVAL.str = yyVAL.str + yyDollar[2].str } - case 1327: + case 1345: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:9088 +//line mysql_sql.y:9130 { yyVAL.str = "ALGORITHM = " + yyDollar[3].str } - case 1328: + case 1346: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:9092 +//line mysql_sql.y:9134 { yyVAL.str = "DEFINER = " } - case 1329: + case 1347: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:9096 +//line mysql_sql.y:9138 { yyVAL.str = "SQL SECURITY " + yyDollar[3].str } - case 1330: + case 1348: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:9101 +//line mysql_sql.y:9143 { yyVAL.str = "" } - case 1331: + case 1349: yyDollar = yyS[yypt-4 : yypt+1] -//line mysql_sql.y:9105 +//line mysql_sql.y:9147 { yyVAL.str = "WITH " + yyDollar[2].str + " CHECK OPTION" } - case 1337: + case 1355: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:9119 +//line mysql_sql.y:9161 { yyVAL.str = "" } - case 1340: + case 1358: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:9127 +//line mysql_sql.y:9169 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1341: + case 1359: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:9133 +//line mysql_sql.y:9175 { var str = yyDollar[1].cstrUnion().Compare() yyLOCAL = tree.NewNumVal(str, str, false, tree.P_char) } yyVAL.union = yyLOCAL - case 1342: + case 1360: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:9138 +//line mysql_sql.y:9180 { yyLOCAL = tree.NewParamExpr(yylex.(*Lexer).GetParamIndex()) } yyVAL.union = yyLOCAL - case 1343: + case 1361: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.AccountAuthOption -//line mysql_sql.y:9144 +//line mysql_sql.y:9186 { var Equal = yyDollar[2].str var AdminName = yyDollar[3].exprUnion() @@ -26327,36 +26536,36 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1344: + case 1362: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:9157 +//line mysql_sql.y:9199 { var str = yyDollar[1].str yyLOCAL = tree.NewNumVal(str, str, false, tree.P_char) } yyVAL.union = yyLOCAL - case 1345: + case 1363: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:9162 +//line mysql_sql.y:9204 { var str = yyDollar[1].cstrUnion().Compare() yyLOCAL = tree.NewNumVal(str, str, false, tree.P_char) } yyVAL.union = yyLOCAL - case 1346: + case 1364: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:9167 +//line mysql_sql.y:9209 { yyLOCAL = tree.NewParamExpr(yylex.(*Lexer).GetParamIndex()) } yyVAL.union = yyLOCAL - case 1347: + case 1365: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AccountIdentified -//line mysql_sql.y:9173 +//line mysql_sql.y:9215 { yyLOCAL = *tree.NewAccountIdentified( tree.AccountIdentifiedByPassword, @@ -26364,10 +26573,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1348: + case 1366: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AccountIdentified -//line mysql_sql.y:9180 +//line mysql_sql.y:9222 { yyLOCAL = *tree.NewAccountIdentified( tree.AccountIdentifiedByPassword, @@ -26375,10 +26584,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1349: + case 1367: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.AccountIdentified -//line mysql_sql.y:9187 +//line mysql_sql.y:9229 { yyLOCAL = *tree.NewAccountIdentified( tree.AccountIdentifiedByRandomPassword, @@ -26386,10 +26595,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1350: + case 1368: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AccountIdentified -//line mysql_sql.y:9194 +//line mysql_sql.y:9236 { yyLOCAL = *tree.NewAccountIdentified( tree.AccountIdentifiedWithSSL, @@ -26397,10 +26606,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1351: + case 1369: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AccountIdentified -//line mysql_sql.y:9201 +//line mysql_sql.y:9243 { yyLOCAL = *tree.NewAccountIdentified( tree.AccountIdentifiedWithSSL, @@ -26408,20 +26617,20 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1352: + case 1370: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.AccountStatus -//line mysql_sql.y:9209 +//line mysql_sql.y:9251 { as := tree.NewAccountStatus() as.Exist = false yyLOCAL = *as } yyVAL.union = yyLOCAL - case 1353: + case 1371: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AccountStatus -//line mysql_sql.y:9215 +//line mysql_sql.y:9257 { as := tree.NewAccountStatus() as.Exist = true @@ -26429,10 +26638,10 @@ yydefault: yyLOCAL = *as } yyVAL.union = yyLOCAL - case 1354: + case 1372: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AccountStatus -//line mysql_sql.y:9222 +//line mysql_sql.y:9264 { as := tree.NewAccountStatus() as.Exist = true @@ -26440,10 +26649,10 @@ yydefault: yyLOCAL = *as } yyVAL.union = yyLOCAL - case 1355: + case 1373: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AccountStatus -//line mysql_sql.y:9229 +//line mysql_sql.y:9271 { as := tree.NewAccountStatus() as.Exist = true @@ -26451,20 +26660,20 @@ yydefault: yyLOCAL = *as } yyVAL.union = yyLOCAL - case 1356: + case 1374: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.AccountComment -//line mysql_sql.y:9237 +//line mysql_sql.y:9279 { ac := tree.NewAccountComment() ac.Exist = false yyLOCAL = *ac } yyVAL.union = yyLOCAL - case 1357: + case 1375: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AccountComment -//line mysql_sql.y:9243 +//line mysql_sql.y:9285 { ac := tree.NewAccountComment() ac.Exist = true @@ -26472,10 +26681,10 @@ yydefault: yyLOCAL = *ac } yyVAL.union = yyLOCAL - case 1358: + case 1376: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9252 +//line mysql_sql.y:9294 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Users = yyDollar[4].usersUnion() @@ -26491,10 +26700,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1359: + case 1377: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9269 +//line mysql_sql.y:9311 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26511,10 +26720,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1360: + case 1378: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9285 +//line mysql_sql.y:9327 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26532,10 +26741,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1361: + case 1379: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9302 +//line mysql_sql.y:9344 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26552,30 +26761,30 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1362: + case 1380: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.AccountsSetOption -//line mysql_sql.y:9320 +//line mysql_sql.y:9362 { yyLOCAL = &tree.AccountsSetOption{ All: true, } } yyVAL.union = yyLOCAL - case 1363: + case 1381: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.AccountsSetOption -//line mysql_sql.y:9326 +//line mysql_sql.y:9368 { yyLOCAL = &tree.AccountsSetOption{ SetAccounts: yyDollar[2].identifierListUnion(), } } yyVAL.union = yyLOCAL - case 1364: + case 1382: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9334 +//line mysql_sql.y:9376 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26593,20 +26802,20 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1365: + case 1383: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.StageStatus -//line mysql_sql.y:9352 +//line mysql_sql.y:9394 { yyLOCAL = tree.StageStatus{ Exist: false, } } yyVAL.union = yyLOCAL - case 1366: + case 1384: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.StageStatus -//line mysql_sql.y:9358 +//line mysql_sql.y:9400 { yyLOCAL = tree.StageStatus{ Exist: true, @@ -26614,10 +26823,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1367: + case 1385: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.StageStatus -//line mysql_sql.y:9365 +//line mysql_sql.y:9407 { yyLOCAL = tree.StageStatus{ Exist: true, @@ -26625,20 +26834,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1368: + case 1386: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.StageComment -//line mysql_sql.y:9373 +//line mysql_sql.y:9415 { yyLOCAL = tree.StageComment{ Exist: false, } } yyVAL.union = yyLOCAL - case 1369: + case 1387: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.StageComment -//line mysql_sql.y:9379 +//line mysql_sql.y:9421 { yyLOCAL = tree.StageComment{ Exist: true, @@ -26646,18 +26855,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1370: + case 1388: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:9388 +//line mysql_sql.y:9430 { yyLOCAL = int64(0) } yyVAL.union = yyLOCAL - case 1371: + case 1389: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:9392 +//line mysql_sql.y:9434 { switch v := yyDollar[3].item.(type) { case int64: @@ -26669,20 +26878,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1372: + case 1390: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.StageUrl -//line mysql_sql.y:9404 +//line mysql_sql.y:9446 { yyLOCAL = tree.StageUrl{ Exist: false, } } yyVAL.union = yyLOCAL - case 1373: + case 1391: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.StageUrl -//line mysql_sql.y:9410 +//line mysql_sql.y:9452 { yyLOCAL = tree.StageUrl{ Exist: true, @@ -26690,20 +26899,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1374: + case 1392: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.StageCredentials -//line mysql_sql.y:9418 +//line mysql_sql.y:9460 { yyLOCAL = tree.StageCredentials{ Exist: false, } } yyVAL.union = yyLOCAL - case 1375: + case 1393: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.StageCredentials -//line mysql_sql.y:9424 +//line mysql_sql.y:9466 { yyLOCAL = tree.StageCredentials{ Exist: true, @@ -26711,61 +26920,61 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1376: + case 1394: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:9433 +//line mysql_sql.y:9475 { yyLOCAL = yyDollar[1].strsUnion() } yyVAL.union = yyLOCAL - case 1377: + case 1395: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:9437 +//line mysql_sql.y:9479 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].strsUnion()...) } yyVAL.union = yyLOCAL - case 1378: + case 1396: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:9442 +//line mysql_sql.y:9484 { yyLOCAL = []string{} } yyVAL.union = yyLOCAL - case 1379: + case 1397: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:9446 +//line mysql_sql.y:9488 { yyLOCAL = append(yyLOCAL, yyDollar[1].str) yyLOCAL = append(yyLOCAL, yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1380: + case 1398: yyDollar = yyS[yypt-3 : yypt+1] -//line mysql_sql.y:9453 +//line mysql_sql.y:9495 { yyVAL.str = yyDollar[3].str } - case 1381: + case 1399: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:9458 +//line mysql_sql.y:9500 { yyVAL.str = "" } - case 1382: + case 1400: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:9462 +//line mysql_sql.y:9504 { yyVAL.str = yyDollar[2].str } - case 1383: + case 1401: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9468 +//line mysql_sql.y:9510 { var ifNotExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26776,10 +26985,10 @@ yydefault: yyLOCAL = tree.NewAlterStage(ifNotExists, name, urlOption, credentialsOption, statusOption, comment) } yyVAL.union = yyLOCAL - case 1384: + case 1402: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9480 +//line mysql_sql.y:9522 { var ifExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26790,154 +26999,154 @@ yydefault: yyLOCAL = tree.NewAlterPublication(ifExists, name, accountsSet, dbName, table, comment) } yyVAL.union = yyLOCAL - case 1385: + case 1403: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.AccountsSetOption -//line mysql_sql.y:9491 +//line mysql_sql.y:9533 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1386: + case 1404: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.AccountsSetOption -//line mysql_sql.y:9495 +//line mysql_sql.y:9537 { yyLOCAL = &tree.AccountsSetOption{ All: true, } } yyVAL.union = yyLOCAL - case 1387: + case 1405: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.AccountsSetOption -//line mysql_sql.y:9501 +//line mysql_sql.y:9543 { yyLOCAL = &tree.AccountsSetOption{ SetAccounts: yyDollar[2].identifierListUnion(), } } yyVAL.union = yyLOCAL - case 1388: + case 1406: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.AccountsSetOption -//line mysql_sql.y:9507 +//line mysql_sql.y:9549 { yyLOCAL = &tree.AccountsSetOption{ AddAccounts: yyDollar[3].identifierListUnion(), } } yyVAL.union = yyLOCAL - case 1389: + case 1407: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.AccountsSetOption -//line mysql_sql.y:9513 +//line mysql_sql.y:9555 { yyLOCAL = &tree.AccountsSetOption{ DropAccounts: yyDollar[3].identifierListUnion(), } } yyVAL.union = yyLOCAL - case 1390: + case 1408: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:9520 +//line mysql_sql.y:9562 { yyVAL.str = "" } - case 1391: + case 1409: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:9524 +//line mysql_sql.y:9566 { yyVAL.str = yyDollar[2].str } - case 1392: + case 1410: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.TableNames -//line mysql_sql.y:9529 +//line mysql_sql.y:9571 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1393: + case 1411: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableNames -//line mysql_sql.y:9533 +//line mysql_sql.y:9575 { yyLOCAL = yyDollar[2].tableNamesUnion() } yyVAL.union = yyLOCAL - case 1394: + case 1412: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9539 +//line mysql_sql.y:9581 { var ifExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) yyLOCAL = tree.NewDropPublication(ifExists, name) } yyVAL.union = yyLOCAL - case 1395: + case 1413: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9547 +//line mysql_sql.y:9589 { var ifExists = yyDollar[4].boolValUnion() var taskID = yyDollar[5].str yyLOCAL = tree.NewDropCcprSubscription(ifExists, taskID) } yyVAL.union = yyLOCAL - case 1396: + case 1414: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9555 +//line mysql_sql.y:9597 { var taskID = yyDollar[4].str yyLOCAL = tree.NewResumeCcprSubscription(taskID) } yyVAL.union = yyLOCAL - case 1397: + case 1415: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9562 +//line mysql_sql.y:9604 { var taskID = yyDollar[4].str yyLOCAL = tree.NewPauseCcprSubscription(taskID) } yyVAL.union = yyLOCAL - case 1398: + case 1416: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9569 +//line mysql_sql.y:9611 { var ifNotExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) yyLOCAL = tree.NewDropStage(ifNotExists, name) } yyVAL.union = yyLOCAL - case 1399: + case 1417: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9577 +//line mysql_sql.y:9619 { var ifExists = yyDollar[5].boolValUnion() var path = yyDollar[6].str yyLOCAL = tree.NewRemoveStageFiles(ifExists, path) } yyVAL.union = yyLOCAL - case 1400: + case 1418: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9585 +//line mysql_sql.y:9627 { var ifExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) yyLOCAL = tree.NewDropSnapShot(ifExists, name, "", "") } yyVAL.union = yyLOCAL - case 1401: + case 1419: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9591 +//line mysql_sql.y:9633 { var ifExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26946,10 +27155,10 @@ yydefault: yyLOCAL = tree.NewDropSnapShot(ifExists, name, accountName, pubName) } yyVAL.union = yyLOCAL - case 1402: + case 1420: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9601 +//line mysql_sql.y:9643 { var ifExists = yyDollar[3].boolValUnion() var name = tree.Identifier(yyDollar[4].cstrUnion().Compare()) @@ -26961,16 +27170,16 @@ yydefault: } yyVAL.union = yyLOCAL - case 1403: + case 1421: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:9614 +//line mysql_sql.y:9656 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1404: + case 1422: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.AccountCommentOrAttribute -//line mysql_sql.y:9619 +//line mysql_sql.y:9661 { var Exist = false var IsComment bool @@ -26983,10 +27192,10 @@ yydefault: } yyVAL.union = yyLOCAL - case 1405: + case 1423: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AccountCommentOrAttribute -//line mysql_sql.y:9631 +//line mysql_sql.y:9673 { var Exist = true var IsComment = true @@ -26998,10 +27207,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1406: + case 1424: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.AccountCommentOrAttribute -//line mysql_sql.y:9642 +//line mysql_sql.y:9684 { var Exist = true var IsComment = false @@ -27013,26 +27222,26 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1407: + case 1425: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.User -//line mysql_sql.y:9750 +//line mysql_sql.y:9792 { yyLOCAL = []*tree.User{yyDollar[1].userUnion()} } yyVAL.union = yyLOCAL - case 1408: + case 1426: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.User -//line mysql_sql.y:9754 +//line mysql_sql.y:9796 { yyLOCAL = append(yyDollar[1].usersUnion(), yyDollar[3].userUnion()) } yyVAL.union = yyLOCAL - case 1409: + case 1427: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.User -//line mysql_sql.y:9760 +//line mysql_sql.y:9802 { var Username = yyDollar[1].usernameRecordUnion().Username var Hostname = yyDollar[1].usernameRecordUnion().Hostname @@ -27044,26 +27253,26 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1410: + case 1428: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.User -//line mysql_sql.y:9773 +//line mysql_sql.y:9815 { yyLOCAL = []*tree.User{yyDollar[1].userUnion()} } yyVAL.union = yyLOCAL - case 1411: + case 1429: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.User -//line mysql_sql.y:9777 +//line mysql_sql.y:9819 { yyLOCAL = append(yyDollar[1].usersUnion(), yyDollar[3].userUnion()) } yyVAL.union = yyLOCAL - case 1412: + case 1430: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.User -//line mysql_sql.y:9783 +//line mysql_sql.y:9825 { var Username = yyDollar[1].usernameRecordUnion().Username var Hostname = yyDollar[1].usernameRecordUnion().Hostname @@ -27075,50 +27284,50 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1413: + case 1431: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UsernameRecord -//line mysql_sql.y:9796 +//line mysql_sql.y:9838 { yyLOCAL = &tree.UsernameRecord{Username: yyDollar[1].str, Hostname: "%"} } yyVAL.union = yyLOCAL - case 1414: + case 1432: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UsernameRecord -//line mysql_sql.y:9800 +//line mysql_sql.y:9842 { yyLOCAL = &tree.UsernameRecord{Username: yyDollar[1].str, Hostname: yyDollar[3].str} } yyVAL.union = yyLOCAL - case 1415: + case 1433: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.UsernameRecord -//line mysql_sql.y:9804 +//line mysql_sql.y:9846 { yyLOCAL = &tree.UsernameRecord{Username: yyDollar[1].str, Hostname: yyDollar[2].str} } yyVAL.union = yyLOCAL - case 1416: + case 1434: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.AccountIdentified -//line mysql_sql.y:9809 +//line mysql_sql.y:9851 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1417: + case 1435: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.AccountIdentified -//line mysql_sql.y:9813 +//line mysql_sql.y:9855 { yyLOCAL = yyDollar[1].userIdentifiedUnion() } yyVAL.union = yyLOCAL - case 1418: + case 1436: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.AccountIdentified -//line mysql_sql.y:9819 +//line mysql_sql.y:9861 { yyLOCAL = &tree.AccountIdentified{ Typ: tree.AccountIdentifiedByPassword, @@ -27126,20 +27335,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1419: + case 1437: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.AccountIdentified -//line mysql_sql.y:9826 +//line mysql_sql.y:9868 { yyLOCAL = &tree.AccountIdentified{ Typ: tree.AccountIdentifiedByRandomPassword, } } yyVAL.union = yyLOCAL - case 1420: + case 1438: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.AccountIdentified -//line mysql_sql.y:9832 +//line mysql_sql.y:9874 { yyLOCAL = &tree.AccountIdentified{ Typ: tree.AccountIdentifiedWithSSL, @@ -27147,16 +27356,16 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1421: + case 1439: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:9841 +//line mysql_sql.y:9883 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1423: + case 1441: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9848 +//line mysql_sql.y:9890 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Roles = yyDollar[4].rolesUnion() @@ -27166,26 +27375,26 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1424: + case 1442: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.Role -//line mysql_sql.y:9859 +//line mysql_sql.y:9901 { yyLOCAL = []*tree.Role{yyDollar[1].roleUnion()} } yyVAL.union = yyLOCAL - case 1425: + case 1443: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.Role -//line mysql_sql.y:9863 +//line mysql_sql.y:9905 { yyLOCAL = append(yyDollar[1].rolesUnion(), yyDollar[3].roleUnion()) } yyVAL.union = yyLOCAL - case 1426: + case 1444: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Role -//line mysql_sql.y:9869 +//line mysql_sql.y:9911 { var UserName = yyDollar[1].cstrUnion().Compare() yyLOCAL = tree.NewRole( @@ -27193,114 +27402,114 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1427: + case 1445: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9878 +//line mysql_sql.y:9920 { yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1428: + case 1446: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9882 +//line mysql_sql.y:9924 { yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1429: + case 1447: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9886 +//line mysql_sql.y:9928 { yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1430: + case 1448: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9890 +//line mysql_sql.y:9932 { yyLOCAL = tree.NewCStr("lag", 1) } yyVAL.union = yyLOCAL - case 1431: + case 1449: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9894 +//line mysql_sql.y:9936 { yyLOCAL = tree.NewCStr("lead", 1) } yyVAL.union = yyLOCAL - case 1432: + case 1450: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9898 +//line mysql_sql.y:9940 { yyLOCAL = tree.NewCStr("first_value", 1) } yyVAL.union = yyLOCAL - case 1433: + case 1451: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9902 +//line mysql_sql.y:9944 { yyLOCAL = tree.NewCStr("last_value", 1) } yyVAL.union = yyLOCAL - case 1434: + case 1452: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:9906 +//line mysql_sql.y:9948 { yyLOCAL = tree.NewCStr("nth_value", 1) } yyVAL.union = yyLOCAL - case 1435: + case 1453: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IndexCategory -//line mysql_sql.y:9911 +//line mysql_sql.y:9953 { yyLOCAL = tree.INDEX_CATEGORY_NONE } yyVAL.union = yyLOCAL - case 1436: + case 1454: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IndexCategory -//line mysql_sql.y:9915 +//line mysql_sql.y:9957 { yyLOCAL = tree.INDEX_CATEGORY_FULLTEXT } yyVAL.union = yyLOCAL - case 1437: + case 1455: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IndexCategory -//line mysql_sql.y:9919 +//line mysql_sql.y:9961 { yyLOCAL = tree.INDEX_CATEGORY_FULLTEXT2 } yyVAL.union = yyLOCAL - case 1438: + case 1456: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IndexCategory -//line mysql_sql.y:9923 +//line mysql_sql.y:9965 { yyLOCAL = tree.INDEX_CATEGORY_SPATIAL } yyVAL.union = yyLOCAL - case 1439: + case 1457: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IndexCategory -//line mysql_sql.y:9927 +//line mysql_sql.y:9969 { yyLOCAL = tree.INDEX_CATEGORY_UNIQUE } yyVAL.union = yyLOCAL - case 1440: + case 1458: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:9933 +//line mysql_sql.y:9975 { io := yyDollar[11].indexOptionUnion() if io == nil { @@ -27329,70 +27538,70 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1441: + case 1459: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:9962 +//line mysql_sql.y:10004 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1442: + case 1460: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:9966 +//line mysql_sql.y:10008 { yyLOCAL = mergeIndexOption(yyDollar[1].indexOptionUnion(), yyDollar[2].indexOptionUnion()) } yyVAL.union = yyLOCAL - case 1443: + case 1461: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:9971 +//line mysql_sql.y:10013 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1444: + case 1462: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:9975 +//line mysql_sql.y:10017 { yyLOCAL = mergeIndexOption(yyDollar[1].indexOptionUnion(), yyDollar[2].indexOptionUnion()) } yyVAL.union = yyLOCAL - case 1445: + case 1463: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:9981 +//line mysql_sql.y:10023 { yyLOCAL = yyDollar[1].indexOptionUnion() } yyVAL.union = yyLOCAL - case 1446: + case 1464: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:9985 +//line mysql_sql.y:10027 { io := tree.NewIndexOption() io.IType = yyDollar[1].indexTypeUnion() yyLOCAL = io } yyVAL.union = yyLOCAL - case 1447: + case 1465: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:9993 +//line mysql_sql.y:10035 { io := tree.NewIndexOption() io.KeyBlockSize = integralToUint64(yyDollar[3].item) yyLOCAL = io } yyVAL.union = yyLOCAL - case 1448: + case 1466: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:9999 +//line mysql_sql.y:10041 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27408,60 +27617,60 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1449: + case 1467: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10012 +//line mysql_sql.y:10054 { io := tree.NewIndexOption() io.AlgoParamVectorOpType = yyDollar[2].str yyLOCAL = io } yyVAL.union = yyLOCAL - case 1450: + case 1468: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10018 +//line mysql_sql.y:10060 { io := tree.NewIndexOption() io.Comment = yyDollar[2].str yyLOCAL = io } yyVAL.union = yyLOCAL - case 1451: + case 1469: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10024 +//line mysql_sql.y:10066 { io := tree.NewIndexOption() io.ParserName = yyDollar[3].cstrUnion().Compare() yyLOCAL = io } yyVAL.union = yyLOCAL - case 1452: + case 1470: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10030 +//line mysql_sql.y:10072 { io := tree.NewIndexOption() io.Visible = tree.VISIBLE_TYPE_VISIBLE yyLOCAL = io } yyVAL.union = yyLOCAL - case 1453: + case 1471: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10036 +//line mysql_sql.y:10078 { io := tree.NewIndexOption() io.Visible = tree.VISIBLE_TYPE_INVISIBLE yyLOCAL = io } yyVAL.union = yyLOCAL - case 1454: + case 1472: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10042 +//line mysql_sql.y:10084 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27476,10 +27685,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1455: + case 1473: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10054 +//line mysql_sql.y:10096 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27494,10 +27703,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1456: + case 1474: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10066 +//line mysql_sql.y:10108 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27512,10 +27721,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1457: + case 1475: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10078 +//line mysql_sql.y:10120 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27530,10 +27739,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1458: + case 1476: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10090 +//line mysql_sql.y:10132 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27548,10 +27757,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1459: + case 1477: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10102 +//line mysql_sql.y:10144 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27566,40 +27775,40 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1460: + case 1478: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10114 +//line mysql_sql.y:10156 { io := tree.NewIndexOption() io.IncludeColumns = yyDollar[3].unresolveNamesUnion() yyLOCAL = io } yyVAL.union = yyLOCAL - case 1461: + case 1479: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10120 +//line mysql_sql.y:10162 { io := tree.NewIndexOption() io.Quantization = yyDollar[2].str yyLOCAL = io } yyVAL.union = yyLOCAL - case 1462: + case 1480: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10126 +//line mysql_sql.y:10168 { io := tree.NewIndexOption() io.DistributionMode = yyDollar[2].str yyLOCAL = io } yyVAL.union = yyLOCAL - case 1463: + case 1481: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10132 +//line mysql_sql.y:10174 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27614,10 +27823,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1464: + case 1482: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10144 +//line mysql_sql.y:10186 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27632,10 +27841,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1465: + case 1483: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10156 +//line mysql_sql.y:10198 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27650,10 +27859,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1466: + case 1484: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10168 +//line mysql_sql.y:10210 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27668,10 +27877,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1467: + case 1485: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10180 +//line mysql_sql.y:10222 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27686,10 +27895,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1468: + case 1486: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10192 +//line mysql_sql.y:10234 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27704,10 +27913,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1469: + case 1487: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10204 +//line mysql_sql.y:10246 { io := tree.NewIndexOption() io.PositionFree = true @@ -27715,10 +27924,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1470: + case 1488: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10211 +//line mysql_sql.y:10253 { io := tree.NewIndexOption() io.PositionFree = false @@ -27726,60 +27935,60 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1471: + case 1489: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10218 +//line mysql_sql.y:10260 { io := tree.NewIndexOption() io.Async = true yyLOCAL = io } yyVAL.union = yyLOCAL - case 1472: + case 1490: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10224 +//line mysql_sql.y:10266 { io := tree.NewIndexOption() io.ForceSync = true yyLOCAL = io } yyVAL.union = yyLOCAL - case 1473: + case 1491: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10230 +//line mysql_sql.y:10272 { io := tree.NewIndexOption() io.Merge = true yyLOCAL = io } yyVAL.union = yyLOCAL - case 1474: + case 1492: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10236 +//line mysql_sql.y:10278 { io := tree.NewIndexOption() io.AutoUpdate = true yyLOCAL = io } yyVAL.union = yyLOCAL - case 1475: + case 1493: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10242 +//line mysql_sql.y:10284 { io := tree.NewIndexOption() io.AutoUpdate = false yyLOCAL = io } yyVAL.union = yyLOCAL - case 1476: + case 1494: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10248 +//line mysql_sql.y:10290 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27794,10 +28003,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1477: + case 1495: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10260 +//line mysql_sql.y:10302 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27812,10 +28021,10 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1478: + case 1496: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IndexOption -//line mysql_sql.y:10272 +//line mysql_sql.y:10314 { val, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -27830,26 +28039,26 @@ yydefault: yyLOCAL = io } yyVAL.union = yyLOCAL - case 1479: + case 1497: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.KeyPart -//line mysql_sql.y:10287 +//line mysql_sql.y:10329 { yyLOCAL = []*tree.KeyPart{yyDollar[1].keyPartUnion()} } yyVAL.union = yyLOCAL - case 1480: + case 1498: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.KeyPart -//line mysql_sql.y:10291 +//line mysql_sql.y:10333 { yyLOCAL = append(yyDollar[1].keyPartsUnion(), yyDollar[3].keyPartUnion()) } yyVAL.union = yyLOCAL - case 1481: + case 1499: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.KeyPart -//line mysql_sql.y:10297 +//line mysql_sql.y:10339 { // Order is parsed but just ignored as MySQL dtree. var ColName = yyDollar[1].unresolvedNameUnion() @@ -27864,10 +28073,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1482: + case 1500: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.KeyPart -//line mysql_sql.y:10311 +//line mysql_sql.y:10353 { var ColName *tree.UnresolvedName var Length int @@ -27881,98 +28090,98 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1483: + case 1501: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10325 +//line mysql_sql.y:10367 { yyLOCAL = tree.INDEX_TYPE_INVALID } yyVAL.union = yyLOCAL - case 1484: + case 1502: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10329 +//line mysql_sql.y:10371 { yyLOCAL = yyDollar[1].indexTypeUnion() } yyVAL.union = yyLOCAL - case 1485: + case 1503: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10335 +//line mysql_sql.y:10377 { yyLOCAL = tree.INDEX_TYPE_BTREE } yyVAL.union = yyLOCAL - case 1486: + case 1504: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10339 +//line mysql_sql.y:10381 { yyLOCAL = tree.INDEX_TYPE_IVFFLAT } yyVAL.union = yyLOCAL - case 1487: + case 1505: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10343 +//line mysql_sql.y:10385 { yyLOCAL = tree.INDEX_TYPE_HNSW } yyVAL.union = yyLOCAL - case 1488: + case 1506: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10347 +//line mysql_sql.y:10389 { yyLOCAL = tree.INDEX_TYPE_IVFPQ } yyVAL.union = yyLOCAL - case 1489: + case 1507: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10351 +//line mysql_sql.y:10393 { yyLOCAL = tree.INDEX_TYPE_CAGRA } yyVAL.union = yyLOCAL - case 1490: + case 1508: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10355 +//line mysql_sql.y:10397 { yyLOCAL = tree.INDEX_TYPE_MASTER } yyVAL.union = yyLOCAL - case 1491: + case 1509: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10359 +//line mysql_sql.y:10401 { yyLOCAL = tree.INDEX_TYPE_HASH } yyVAL.union = yyLOCAL - case 1492: + case 1510: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10363 +//line mysql_sql.y:10405 { yyLOCAL = tree.INDEX_TYPE_RTREE } yyVAL.union = yyLOCAL - case 1493: + case 1511: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.IndexType -//line mysql_sql.y:10367 +//line mysql_sql.y:10409 { yyLOCAL = tree.INDEX_TYPE_BSI } yyVAL.union = yyLOCAL - case 1494: + case 1512: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10373 +//line mysql_sql.y:10415 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var Name = tree.Identifier(yyDollar[4].str) @@ -27986,10 +28195,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1495: + case 1513: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10387 +//line mysql_sql.y:10429 { var t = tree.NewCloneDatabase() t.IfNotExists = yyDollar[3].ifNotExistsUnion() @@ -28000,10 +28209,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1496: + case 1514: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10397 +//line mysql_sql.y:10439 { var DbName = tree.Identifier(yyDollar[4].str) var FromUri = yyDollar[6].str @@ -28021,100 +28230,100 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1497: + case 1515: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.SubscriptionOption -//line mysql_sql.y:10415 +//line mysql_sql.y:10457 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1498: + case 1516: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.SubscriptionOption -//line mysql_sql.y:10419 +//line mysql_sql.y:10461 { var From = tree.Identifier(yyDollar[2].str) var Publication = tree.Identifier(yyDollar[4].cstrUnion().Compare()) yyLOCAL = tree.NewSubscriptionOption(From, Publication) } yyVAL.union = yyLOCAL - case 1501: + case 1519: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10430 +//line mysql_sql.y:10472 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1502: + case 1520: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10434 +//line mysql_sql.y:10476 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1503: + case 1521: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10438 +//line mysql_sql.y:10480 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1504: + case 1522: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10443 +//line mysql_sql.y:10485 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1505: + case 1523: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10447 +//line mysql_sql.y:10489 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1506: + case 1524: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:10452 +//line mysql_sql.y:10494 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1507: + case 1525: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:10456 +//line mysql_sql.y:10498 { yyLOCAL = yyDollar[1].createOptionsUnion() } yyVAL.union = yyLOCAL - case 1508: + case 1526: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:10462 +//line mysql_sql.y:10504 { yyLOCAL = []tree.CreateOption{yyDollar[1].createOptionUnion()} } yyVAL.union = yyLOCAL - case 1509: + case 1527: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.CreateOption -//line mysql_sql.y:10466 +//line mysql_sql.y:10508 { yyLOCAL = append(yyDollar[1].createOptionsUnion(), yyDollar[2].createOptionUnion()) } yyVAL.union = yyLOCAL - case 1510: + case 1528: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:10472 +//line mysql_sql.y:10514 { var IsDefault = yyDollar[1].defaultOptionalUnion() var Charset = yyDollar[4].str @@ -28124,10 +28333,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1511: + case 1529: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:10481 +//line mysql_sql.y:10523 { var IsDefault = yyDollar[1].defaultOptionalUnion() var Collate = yyDollar[4].str @@ -28137,35 +28346,35 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1512: + case 1530: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.CreateOption -//line mysql_sql.y:10490 +//line mysql_sql.y:10532 { var Encrypt = yyDollar[4].str yyLOCAL = tree.NewCreateOptionEncryption(Encrypt) } yyVAL.union = yyLOCAL - case 1513: + case 1531: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10496 +//line mysql_sql.y:10538 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1514: + case 1532: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10500 +//line mysql_sql.y:10542 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1515: + case 1533: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10506 +//line mysql_sql.y:10548 { var taskID uint64 switch v := yyDollar[4].item.(type) { @@ -28182,10 +28391,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1516: + case 1534: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10524 +//line mysql_sql.y:10566 { var taskID uint64 switch v := yyDollar[4].item.(type) { @@ -28202,10 +28411,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1517: + case 1535: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10542 +//line mysql_sql.y:10584 { var taskID uint64 switch v := yyDollar[4].item.(type) { @@ -28222,26 +28431,26 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1518: + case 1536: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10559 +//line mysql_sql.y:10601 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1519: + case 1537: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10563 +//line mysql_sql.y:10605 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1520: + case 1538: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10569 +//line mysql_sql.y:10611 { t := tree.NewDataBranchCreateTable() t.CreateTable.Table = *yyDollar[5].tableNameUnion() @@ -28252,10 +28461,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1521: + case 1539: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10579 +//line mysql_sql.y:10621 { t := tree.NewDataBranchCreateDatabase() t.DstDatabase = tree.Identifier(yyDollar[5].str) @@ -28265,30 +28474,30 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1522: + case 1540: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10588 +//line mysql_sql.y:10630 { t := tree.NewDataBranchDeleteTable() t.TableName = *yyDollar[5].tableNameUnion() yyLOCAL = t } yyVAL.union = yyLOCAL - case 1523: + case 1541: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10594 +//line mysql_sql.y:10636 { t := tree.NewDataBranchDeleteDatabase() t.DatabaseName = tree.Identifier(yyDollar[5].str) yyLOCAL = t } yyVAL.union = yyLOCAL - case 1524: + case 1542: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10600 +//line mysql_sql.y:10642 { t := tree.NewDataBranchDiff() t.TargetTable = *yyDollar[4].tableNameUnion() @@ -28298,10 +28507,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1525: + case 1543: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10609 +//line mysql_sql.y:10651 { t := tree.NewDataBranchMerge() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -28310,10 +28519,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1526: + case 1544: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10617 +//line mysql_sql.y:10659 { t := tree.NewDataBranchPick() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -28323,10 +28532,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1527: + case 1545: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10626 +//line mysql_sql.y:10668 { t := tree.NewDataBranchPick() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -28337,10 +28546,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1528: + case 1546: yyDollar = yyS[yypt-12 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10636 +//line mysql_sql.y:10678 { t := tree.NewDataBranchPick() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -28351,10 +28560,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1529: + case 1547: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10646 +//line mysql_sql.y:10688 { t := tree.NewDataBranchPick() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -28366,10 +28575,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1530: + case 1548: yyDollar = yyS[yypt-13 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10657 +//line mysql_sql.y:10699 { t := tree.NewDataBranchPick() t.SrcTable = *yyDollar[4].tableNameUnion() @@ -28381,54 +28590,54 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1531: + case 1549: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:10669 +//line mysql_sql.y:10711 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1532: + case 1550: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.IdentifierList -//line mysql_sql.y:10673 +//line mysql_sql.y:10715 { yyLOCAL = yyDollar[3].identifierListUnion() } yyVAL.union = yyLOCAL - case 1533: + case 1551: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:10678 +//line mysql_sql.y:10720 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1534: + case 1552: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:10682 +//line mysql_sql.y:10724 { yyLOCAL = &tree.DiffOutputOpt{ As: *yyDollar[3].tableNameUnion(), } } yyVAL.union = yyLOCAL - case 1535: + case 1553: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:10688 +//line mysql_sql.y:10730 { yyLOCAL = &tree.DiffOutputOpt{ DirPath: yyDollar[3].str, } } yyVAL.union = yyLOCAL - case 1536: + case 1554: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:10694 +//line mysql_sql.y:10736 { x, errStr := util.GetInt64(yyDollar[3].item) if errStr != "" { @@ -28440,68 +28649,68 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1537: + case 1555: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:10701 +//line mysql_sql.y:10743 { yyLOCAL = &tree.DiffOutputOpt{ Count: true, } } yyVAL.union = yyLOCAL - case 1538: + case 1556: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.DiffOutputOpt -//line mysql_sql.y:10707 +//line mysql_sql.y:10749 { yyLOCAL = &tree.DiffOutputOpt{ Summary: true, } } yyVAL.union = yyLOCAL - case 1539: + case 1557: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ConflictOpt -//line mysql_sql.y:10715 +//line mysql_sql.y:10757 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1540: + case 1558: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ConflictOpt -//line mysql_sql.y:10719 +//line mysql_sql.y:10761 { yyLOCAL = &tree.ConflictOpt{ Opt: tree.CONFLICT_FAIL, } } yyVAL.union = yyLOCAL - case 1541: + case 1559: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ConflictOpt -//line mysql_sql.y:10725 +//line mysql_sql.y:10767 { yyLOCAL = &tree.ConflictOpt{ Opt: tree.CONFLICT_SKIP, } } yyVAL.union = yyLOCAL - case 1542: + case 1560: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ConflictOpt -//line mysql_sql.y:10731 +//line mysql_sql.y:10773 { yyLOCAL = &tree.ConflictOpt{ Opt: tree.CONFLICT_ACCEPT, } } yyVAL.union = yyLOCAL - case 1543: + case 1561: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.PickKeys -//line mysql_sql.y:10739 +//line mysql_sql.y:10781 { yyLOCAL = &tree.PickKeys{ Type: tree.PickKeysValues, @@ -28509,10 +28718,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1544: + case 1562: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.PickKeys -//line mysql_sql.y:10746 +//line mysql_sql.y:10788 { yyLOCAL = &tree.PickKeys{ Type: tree.PickKeysSubquery, @@ -28520,74 +28729,74 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1545: + case 1563: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ToAccountOpt -//line mysql_sql.y:10755 +//line mysql_sql.y:10797 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1546: + case 1564: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ToAccountOpt -//line mysql_sql.y:10759 +//line mysql_sql.y:10801 { yyLOCAL = &tree.ToAccountOpt{ AccountName: tree.Identifier(yyDollar[3].cstrUnion().Compare()), } } yyVAL.union = yyLOCAL - case 1547: + case 1565: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10767 +//line mysql_sql.y:10809 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1548: + case 1566: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:10771 +//line mysql_sql.y:10813 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1549: + case 1567: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:10776 +//line mysql_sql.y:10818 { yyVAL.str = "" } - case 1550: + case 1568: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:10777 +//line mysql_sql.y:10819 { yyVAL.str = "ignore" } - case 1551: + case 1569: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:10778 +//line mysql_sql.y:10820 { yyVAL.str = "replace" } - case 1552: + case 1570: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:10781 +//line mysql_sql.y:10823 { yyVAL.str = "ignore" } - case 1553: + case 1571: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:10782 +//line mysql_sql.y:10824 { yyVAL.str = "replace" } - case 1554: + case 1572: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10786 +//line mysql_sql.y:10828 { t := tree.NewCreateTable() t.Temporary = yyDollar[2].boolValUnion() @@ -28600,10 +28809,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1555: + case 1573: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10798 +//line mysql_sql.y:10840 { t := tree.NewCreateTable() t.IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -28613,10 +28822,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1556: + case 1574: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10807 +//line mysql_sql.y:10849 { t := tree.NewCreateTable() t.IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -28626,10 +28835,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1557: + case 1575: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10816 +//line mysql_sql.y:10858 { t := tree.NewCreateTable() t.IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -28639,10 +28848,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1558: + case 1576: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10825 +//line mysql_sql.y:10867 { t := tree.NewCreateTable() t.IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -28652,10 +28861,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1559: + case 1577: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10834 +//line mysql_sql.y:10876 { t := tree.NewCreateTable() t.IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -28665,10 +28874,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1560: + case 1578: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10843 +//line mysql_sql.y:10885 { t := tree.NewCreateTable() t.IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -28678,10 +28887,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1561: + case 1579: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10852 +//line mysql_sql.y:10894 { t := tree.NewCreateTable() t.IfNotExists = yyDollar[4].ifNotExistsUnion() @@ -28690,10 +28899,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1562: + case 1580: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10860 +//line mysql_sql.y:10902 { t := tree.NewCreateTable() t.IsClusterTable = true @@ -28706,10 +28915,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1563: + case 1581: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10872 +//line mysql_sql.y:10914 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[6].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -28724,10 +28933,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1564: + case 1582: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10886 +//line mysql_sql.y:10928 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[9].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -28743,10 +28952,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1565: + case 1583: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10901 +//line mysql_sql.y:10943 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[7].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -28762,10 +28971,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1566: + case 1584: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10906 +//line mysql_sql.y:10948 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[10].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -28782,10 +28991,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1567: + case 1585: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10911 +//line mysql_sql.y:10953 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[8].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -28801,10 +29010,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1568: + case 1586: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10916 +//line mysql_sql.y:10958 { if intoErr := tree.ValidateSelectIntoNotAllowed(yyDollar[11].selectUnion()); intoErr != "" { yylex.Error(intoErr) @@ -28821,10 +29030,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1569: + case 1587: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10921 +//line mysql_sql.y:10963 { t := tree.NewCreateTable() t.IsAsLike = true @@ -28835,10 +29044,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1570: + case 1588: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10931 +//line mysql_sql.y:10973 { t := tree.NewCreateTable() t.Temporary = yyDollar[2].boolValUnion() @@ -28848,10 +29057,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1571: + case 1589: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10940 +//line mysql_sql.y:10982 { t := tree.NewCloneTable() t.CreateTable.Temporary = yyDollar[2].boolValUnion() @@ -28865,10 +29074,10 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1572: + case 1590: yyDollar = yyS[yypt-11 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:10953 +//line mysql_sql.y:10995 { var TableName = yyDollar[5].tableNameUnion() var FromUri = yyDollar[7].str @@ -28892,19 +29101,19 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1573: + case 1591: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:10978 +//line mysql_sql.y:11020 { yyLOCAL = yyDollar[1].loadParamUnion() yyLOCAL.Tail = yyDollar[2].tailParamUnion() } yyVAL.union = yyLOCAL - case 1574: + case 1592: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:10985 +//line mysql_sql.y:11027 { yyLOCAL = &tree.ExternParam{ ExParamConst: tree.ExParamConst{ @@ -28915,10 +29124,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1575: + case 1593: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:10995 +//line mysql_sql.y:11037 { yyLOCAL = &tree.ExternParam{ ExParamConst: tree.ExParamConst{ @@ -28932,10 +29141,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1576: + case 1594: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:11008 +//line mysql_sql.y:11050 { yyLOCAL = &tree.ExternParam{ ExParamConst: tree.ExParamConst{ @@ -28944,10 +29153,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1577: + case 1595: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:11016 +//line mysql_sql.y:11058 { yyLOCAL = &tree.ExternParam{ ExParamConst: tree.ExParamConst{ @@ -28957,10 +29166,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1578: + case 1596: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ExternParam -//line mysql_sql.y:11025 +//line mysql_sql.y:11067 { yyLOCAL = &tree.ExternParam{ ExParamConst: tree.ExParamConst{ @@ -28969,55 +29178,55 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1579: + case 1597: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:11034 +//line mysql_sql.y:11076 { yyVAL.str = "" } - case 1580: + case 1598: yyDollar = yyS[yypt-4 : yypt+1] -//line mysql_sql.y:11038 +//line mysql_sql.y:11080 { yyVAL.str = yyDollar[4].str } - case 1581: + case 1599: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:11044 +//line mysql_sql.y:11086 { yyLOCAL = yyDollar[1].strsUnion() } yyVAL.union = yyLOCAL - case 1582: + case 1600: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:11048 +//line mysql_sql.y:11090 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].strsUnion()...) } yyVAL.union = yyLOCAL - case 1583: + case 1601: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:11053 +//line mysql_sql.y:11095 { yyLOCAL = []string{} } yyVAL.union = yyLOCAL - case 1584: + case 1602: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:11057 +//line mysql_sql.y:11099 { yyLOCAL = append(yyLOCAL, yyDollar[1].str) yyLOCAL = append(yyLOCAL, yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1585: + case 1603: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.TailParameter -//line mysql_sql.y:11064 +//line mysql_sql.y:11106 { yyLOCAL = &tree.TailParameter{ Charset: yyDollar[1].str, @@ -29029,22 +29238,22 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1586: + case 1604: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:11076 +//line mysql_sql.y:11118 { yyVAL.str = "" } - case 1587: + case 1605: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:11080 +//line mysql_sql.y:11122 { yyVAL.str = yyDollar[2].str } - case 1588: + case 1606: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:11086 +//line mysql_sql.y:11128 { var Name = yyDollar[4].tableNameUnion() var Type = yyDollar[5].columnTypeUnion() @@ -29066,10 +29275,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1589: + case 1607: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:11107 +//line mysql_sql.y:11149 { locale := "" fstr := "bigint" @@ -29084,44 +29293,44 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1590: + case 1608: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:11121 +//line mysql_sql.y:11163 { yyLOCAL = yyDollar[2].columnTypeUnion() } yyVAL.union = yyLOCAL - case 1591: + case 1609: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.TypeOption -//line mysql_sql.y:11125 +//line mysql_sql.y:11167 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1592: + case 1610: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.TypeOption -//line mysql_sql.y:11129 +//line mysql_sql.y:11171 { yyLOCAL = &tree.TypeOption{ Type: yyDollar[2].columnTypeUnion(), } } yyVAL.union = yyLOCAL - case 1593: + case 1611: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.IncrementByOption -//line mysql_sql.y:11135 +//line mysql_sql.y:11177 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1594: + case 1612: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IncrementByOption -//line mysql_sql.y:11139 +//line mysql_sql.y:11181 { yyLOCAL = &tree.IncrementByOption{ Minus: false, @@ -29129,10 +29338,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1595: + case 1613: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.IncrementByOption -//line mysql_sql.y:11146 +//line mysql_sql.y:11188 { yyLOCAL = &tree.IncrementByOption{ Minus: false, @@ -29140,10 +29349,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1596: + case 1614: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.IncrementByOption -//line mysql_sql.y:11153 +//line mysql_sql.y:11195 { yyLOCAL = &tree.IncrementByOption{ Minus: true, @@ -29151,10 +29360,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1597: + case 1615: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IncrementByOption -//line mysql_sql.y:11160 +//line mysql_sql.y:11202 { yyLOCAL = &tree.IncrementByOption{ Minus: true, @@ -29162,42 +29371,42 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1598: + case 1616: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11167 +//line mysql_sql.y:11209 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1599: + case 1617: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11171 +//line mysql_sql.y:11213 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1600: + case 1618: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11175 +//line mysql_sql.y:11217 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1601: + case 1619: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.MinValueOption -//line mysql_sql.y:11179 +//line mysql_sql.y:11221 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1602: + case 1620: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.MinValueOption -//line mysql_sql.y:11183 +//line mysql_sql.y:11225 { yyLOCAL = &tree.MinValueOption{ Minus: false, @@ -29205,10 +29414,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1603: + case 1621: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.MinValueOption -//line mysql_sql.y:11190 +//line mysql_sql.y:11232 { yyLOCAL = &tree.MinValueOption{ Minus: true, @@ -29216,18 +29425,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1604: + case 1622: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.MaxValueOption -//line mysql_sql.y:11197 +//line mysql_sql.y:11239 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1605: + case 1623: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.MaxValueOption -//line mysql_sql.y:11201 +//line mysql_sql.y:11243 { yyLOCAL = &tree.MaxValueOption{ Minus: false, @@ -29235,10 +29444,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1606: + case 1624: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.MaxValueOption -//line mysql_sql.y:11208 +//line mysql_sql.y:11250 { yyLOCAL = &tree.MaxValueOption{ Minus: true, @@ -29246,46 +29455,46 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1607: + case 1625: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.CycleOption -//line mysql_sql.y:11215 +//line mysql_sql.y:11257 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1608: + case 1626: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.CycleOption -//line mysql_sql.y:11219 +//line mysql_sql.y:11261 { yyLOCAL = &tree.CycleOption{ Cycle: false, } } yyVAL.union = yyLOCAL - case 1609: + case 1627: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CycleOption -//line mysql_sql.y:11225 +//line mysql_sql.y:11267 { yyLOCAL = &tree.CycleOption{ Cycle: true, } } yyVAL.union = yyLOCAL - case 1610: + case 1628: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.StartWithOption -//line mysql_sql.y:11231 +//line mysql_sql.y:11273 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1611: + case 1629: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.StartWithOption -//line mysql_sql.y:11235 +//line mysql_sql.y:11277 { yyLOCAL = &tree.StartWithOption{ Minus: false, @@ -29293,10 +29502,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1612: + case 1630: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.StartWithOption -//line mysql_sql.y:11242 +//line mysql_sql.y:11284 { yyLOCAL = &tree.StartWithOption{ Minus: false, @@ -29304,10 +29513,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1613: + case 1631: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.StartWithOption -//line mysql_sql.y:11249 +//line mysql_sql.y:11291 { yyLOCAL = &tree.StartWithOption{ Minus: true, @@ -29315,10 +29524,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1614: + case 1632: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.StartWithOption -//line mysql_sql.y:11256 +//line mysql_sql.y:11298 { yyLOCAL = &tree.StartWithOption{ Minus: true, @@ -29326,58 +29535,58 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1615: + case 1633: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11263 +//line mysql_sql.y:11305 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1616: + case 1634: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11267 +//line mysql_sql.y:11309 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1617: + case 1635: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11272 +//line mysql_sql.y:11314 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1618: + case 1636: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11276 +//line mysql_sql.y:11318 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1619: + case 1637: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11280 +//line mysql_sql.y:11322 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1620: + case 1638: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.PartitionOption -//line mysql_sql.y:11285 +//line mysql_sql.y:11327 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1621: + case 1639: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.PartitionOption -//line mysql_sql.y:11289 +//line mysql_sql.y:11331 { yyDollar[3].partitionByUnion().Num = uint64(yyDollar[4].int64ValUnion()) var PartBy = yyDollar[3].partitionByUnion() @@ -29390,18 +29599,18 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1622: + case 1640: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ClusterByOption -//line mysql_sql.y:11302 +//line mysql_sql.y:11344 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1623: + case 1641: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ClusterByOption -//line mysql_sql.y:11306 +//line mysql_sql.y:11348 { var ColumnList = []*tree.UnresolvedName{yyDollar[3].unresolvedNameUnion()} yyLOCAL = tree.NewClusterByOption( @@ -29410,10 +29619,10 @@ yydefault: } yyVAL.union = yyLOCAL - case 1624: + case 1642: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.ClusterByOption -//line mysql_sql.y:11314 +//line mysql_sql.y:11356 { var ColumnList = yyDollar[4].unresolveNamesUnion() yyLOCAL = tree.NewClusterByOption( @@ -29421,18 +29630,18 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1625: + case 1643: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11322 +//line mysql_sql.y:11364 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1626: + case 1644: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11326 +//line mysql_sql.y:11368 { var IsSubPartition = true var PType = yyDollar[3].partitionByUnion().PType @@ -29446,42 +29655,42 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1627: + case 1645: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.Partition -//line mysql_sql.y:11340 +//line mysql_sql.y:11382 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1628: + case 1646: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.Partition -//line mysql_sql.y:11344 +//line mysql_sql.y:11386 { yyLOCAL = yyDollar[2].partitionsUnion() } yyVAL.union = yyLOCAL - case 1629: + case 1647: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.Partition -//line mysql_sql.y:11350 +//line mysql_sql.y:11392 { yyLOCAL = []*tree.Partition{yyDollar[1].partitionUnion()} } yyVAL.union = yyLOCAL - case 1630: + case 1648: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.Partition -//line mysql_sql.y:11354 +//line mysql_sql.y:11396 { yyLOCAL = append(yyDollar[1].partitionsUnion(), yyDollar[3].partitionUnion()) } yyVAL.union = yyLOCAL - case 1631: + case 1649: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.Partition -//line mysql_sql.y:11360 +//line mysql_sql.y:11402 { var Name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) var Values = yyDollar[3].valuesUnion() @@ -29495,10 +29704,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1632: + case 1650: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.Partition -//line mysql_sql.y:11373 +//line mysql_sql.y:11415 { var Name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) var Values = yyDollar[3].valuesUnion() @@ -29512,42 +29721,42 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1633: + case 1651: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.SubPartition -//line mysql_sql.y:11387 +//line mysql_sql.y:11429 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1634: + case 1652: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.SubPartition -//line mysql_sql.y:11391 +//line mysql_sql.y:11433 { yyLOCAL = yyDollar[2].subPartitionsUnion() } yyVAL.union = yyLOCAL - case 1635: + case 1653: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.SubPartition -//line mysql_sql.y:11397 +//line mysql_sql.y:11439 { yyLOCAL = []*tree.SubPartition{yyDollar[1].subPartitionUnion()} } yyVAL.union = yyLOCAL - case 1636: + case 1654: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.SubPartition -//line mysql_sql.y:11401 +//line mysql_sql.y:11443 { yyLOCAL = append(yyDollar[1].subPartitionsUnion(), yyDollar[3].subPartitionUnion()) } yyVAL.union = yyLOCAL - case 1637: + case 1655: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.SubPartition -//line mysql_sql.y:11407 +//line mysql_sql.y:11449 { var Name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) var Options []tree.TableOption @@ -29557,10 +29766,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1638: + case 1656: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.SubPartition -//line mysql_sql.y:11416 +//line mysql_sql.y:11458 { var Name = tree.Identifier(yyDollar[2].cstrUnion().Compare()) var Options = yyDollar[3].tableOptionsUnion() @@ -29570,26 +29779,26 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1639: + case 1657: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:11427 +//line mysql_sql.y:11469 { yyLOCAL = []tree.TableOption{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL - case 1640: + case 1658: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:11431 +//line mysql_sql.y:11473 { yyLOCAL = append(yyDollar[1].tableOptionsUnion(), yyDollar[2].tableOptionUnion()) } yyVAL.union = yyLOCAL - case 1641: + case 1659: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11437 +//line mysql_sql.y:11479 { if option, ok := yyDollar[1].tableOptionUnion().(*tree.TableOptionAutoIDCache); ok { option.Free() @@ -29599,37 +29808,37 @@ yydefault: yyLOCAL = yyDollar[1].tableOptionUnion() } yyVAL.union = yyLOCAL - case 1642: + case 1660: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Values -//line mysql_sql.y:11447 +//line mysql_sql.y:11489 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1643: + case 1661: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Values -//line mysql_sql.y:11451 +//line mysql_sql.y:11493 { expr := tree.NewMaxValue() var valueList = tree.Exprs{expr} yyLOCAL = tree.NewValuesLessThan(valueList) } yyVAL.union = yyLOCAL - case 1644: + case 1662: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Values -//line mysql_sql.y:11457 +//line mysql_sql.y:11499 { var valueList = yyDollar[5].exprsUnion() yyLOCAL = tree.NewValuesLessThan(valueList) } yyVAL.union = yyLOCAL - case 1645: + case 1663: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Values -//line mysql_sql.y:11462 +//line mysql_sql.y:11504 { var valueList = yyDollar[4].exprsUnion() yyLOCAL = tree.NewValuesIn( @@ -29637,18 +29846,18 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1646: + case 1664: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:11470 +//line mysql_sql.y:11512 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1647: + case 1665: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:11474 +//line mysql_sql.y:11516 { res, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -29661,18 +29870,18 @@ yydefault: yyLOCAL = res } yyVAL.union = yyLOCAL - case 1648: + case 1666: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:11485 +//line mysql_sql.y:11527 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 1649: + case 1667: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:11489 +//line mysql_sql.y:11531 { res, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -29685,10 +29894,10 @@ yydefault: yyLOCAL = res } yyVAL.union = yyLOCAL - case 1650: + case 1668: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11501 +//line mysql_sql.y:11543 { rangeTyp := tree.NewRangeType() rangeTyp.Expr = yyDollar[3].exprUnion() @@ -29697,10 +29906,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1651: + case 1669: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11509 +//line mysql_sql.y:11551 { rangeTyp := tree.NewRangeType() rangeTyp.ColumnList = yyDollar[4].unresolveNamesUnion() @@ -29709,10 +29918,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1652: + case 1670: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11517 +//line mysql_sql.y:11559 { listTyp := tree.NewListType() listTyp.Expr = yyDollar[3].exprUnion() @@ -29721,10 +29930,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1653: + case 1671: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11525 +//line mysql_sql.y:11567 { listTyp := tree.NewListType() listTyp.ColumnList = yyDollar[4].unresolveNamesUnion() @@ -29733,10 +29942,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1655: + case 1673: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11536 +//line mysql_sql.y:11578 { keyTyp := tree.NewKeyType() keyTyp.Linear = yyDollar[1].boolValUnion() @@ -29746,10 +29955,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1656: + case 1674: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11545 +//line mysql_sql.y:11587 { keyTyp := tree.NewKeyType() keyTyp.Linear = yyDollar[1].boolValUnion() @@ -29760,10 +29969,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1657: + case 1675: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.PartitionBy -//line mysql_sql.y:11555 +//line mysql_sql.y:11597 { Linear := yyDollar[1].boolValUnion() Expr := yyDollar[4].exprUnion() @@ -29773,18 +29982,18 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1658: + case 1676: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:11565 +//line mysql_sql.y:11607 { yyLOCAL = 2 } yyVAL.union = yyLOCAL - case 1659: + case 1677: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:11569 +//line mysql_sql.y:11611 { value, ok := signedIntegral(yylex, yyDollar[3].item) if !ok { @@ -29793,551 +30002,551 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 1660: + case 1678: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11576 +//line mysql_sql.y:11618 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1661: + case 1679: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:11580 +//line mysql_sql.y:11622 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1662: + case 1680: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.IcebergTableParam -//line mysql_sql.y:11586 +//line mysql_sql.y:11628 { yyLOCAL = tree.NewIcebergTableParam(yyDollar[4].icebergOptionsUnion()) } yyVAL.union = yyLOCAL - case 1663: + case 1681: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.IcebergOptions -//line mysql_sql.y:11591 +//line mysql_sql.y:11633 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1664: + case 1682: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.IcebergOptions -//line mysql_sql.y:11595 +//line mysql_sql.y:11637 { yyLOCAL = yyDollar[3].icebergOptionsUnion() } yyVAL.union = yyLOCAL - case 1665: + case 1683: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.IcebergOptions -//line mysql_sql.y:11601 +//line mysql_sql.y:11643 { yyLOCAL = tree.IcebergOptions{yyDollar[1].icebergOptionUnion()} } yyVAL.union = yyLOCAL - case 1666: + case 1684: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.IcebergOptions -//line mysql_sql.y:11605 +//line mysql_sql.y:11647 { yyLOCAL = append(yyDollar[1].icebergOptionsUnion(), yyDollar[3].icebergOptionUnion()) } yyVAL.union = yyLOCAL - case 1667: + case 1685: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IcebergOption -//line mysql_sql.y:11611 +//line mysql_sql.y:11653 { yyLOCAL = tree.NewIcebergOption(tree.Identifier(yyDollar[1].str), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1668: + case 1686: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11617 +//line mysql_sql.y:11659 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1669: + case 1687: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11621 +//line mysql_sql.y:11663 { yyVAL.str = yyDollar[1].str } - case 1670: + case 1688: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11627 +//line mysql_sql.y:11669 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1671: + case 1689: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11631 +//line mysql_sql.y:11673 { yyVAL.str = yyDollar[1].str } - case 1672: + case 1690: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.MongoDBTableParam -//line mysql_sql.y:11637 +//line mysql_sql.y:11679 { yyLOCAL = tree.NewMongoDBTableParam(yyDollar[4].mongodbOptionsUnion()) } yyVAL.union = yyLOCAL - case 1673: + case 1691: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.MongoDBOptions -//line mysql_sql.y:11642 +//line mysql_sql.y:11684 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1674: + case 1692: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.MongoDBOptions -//line mysql_sql.y:11646 +//line mysql_sql.y:11688 { yyLOCAL = yyDollar[3].mongodbOptionsUnion() } yyVAL.union = yyLOCAL - case 1675: + case 1693: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.MongoDBOptions -//line mysql_sql.y:11652 +//line mysql_sql.y:11694 { yyLOCAL = tree.MongoDBOptions{yyDollar[1].mongodbOptionUnion()} } yyVAL.union = yyLOCAL - case 1676: + case 1694: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.MongoDBOptions -//line mysql_sql.y:11656 +//line mysql_sql.y:11698 { yyLOCAL = append(yyDollar[1].mongodbOptionsUnion(), yyDollar[3].mongodbOptionUnion()) } yyVAL.union = yyLOCAL - case 1677: + case 1695: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.MongoDBOption -//line mysql_sql.y:11662 +//line mysql_sql.y:11704 { yyLOCAL = tree.NewMongoDBOption(tree.Identifier(yyDollar[1].str), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1678: + case 1696: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11668 +//line mysql_sql.y:11710 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1679: + case 1697: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11672 +//line mysql_sql.y:11714 { yyVAL.str = yyDollar[1].str } - case 1680: + case 1698: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11678 +//line mysql_sql.y:11720 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1681: + case 1699: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11682 +//line mysql_sql.y:11724 { yyVAL.str = yyDollar[1].str } - case 1682: + case 1700: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.DataStreamTableParam -//line mysql_sql.y:11688 +//line mysql_sql.y:11730 { yyLOCAL = tree.NewDataStreamTableParam(yyDollar[4].datastreamOptionsUnion()) } yyVAL.union = yyLOCAL - case 1683: + case 1701: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.DataStreamOptions -//line mysql_sql.y:11693 +//line mysql_sql.y:11735 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1684: + case 1702: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.DataStreamOptions -//line mysql_sql.y:11697 +//line mysql_sql.y:11739 { yyLOCAL = yyDollar[3].datastreamOptionsUnion() } yyVAL.union = yyLOCAL - case 1685: + case 1703: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.DataStreamOptions -//line mysql_sql.y:11703 +//line mysql_sql.y:11745 { yyLOCAL = tree.DataStreamOptions{yyDollar[1].datastreamOptionUnion()} } yyVAL.union = yyLOCAL - case 1686: + case 1704: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.DataStreamOptions -//line mysql_sql.y:11707 +//line mysql_sql.y:11749 { yyLOCAL = append(yyDollar[1].datastreamOptionsUnion(), yyDollar[3].datastreamOptionUnion()) } yyVAL.union = yyLOCAL - case 1687: + case 1705: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.DataStreamOption -//line mysql_sql.y:11713 +//line mysql_sql.y:11755 { yyLOCAL = tree.NewDataStreamOption(tree.Identifier(yyDollar[1].str), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1688: + case 1706: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.ForeignTableParam -//line mysql_sql.y:11719 +//line mysql_sql.y:11761 { yyLOCAL = tree.NewForeignTableParam(yyDollar[3].str, yyDollar[4].foreignTableOptionsUnion()) } yyVAL.union = yyLOCAL - case 1689: + case 1707: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.KafkaTableParam -//line mysql_sql.y:11725 +//line mysql_sql.y:11767 { yyLOCAL = tree.NewKafkaTableParam(yyDollar[4].kafkaTableOptionsUnion()) } yyVAL.union = yyLOCAL - case 1690: + case 1708: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.KafkaTableOptions -//line mysql_sql.y:11730 +//line mysql_sql.y:11772 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1691: + case 1709: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.KafkaTableOptions -//line mysql_sql.y:11734 +//line mysql_sql.y:11776 { yyLOCAL = yyDollar[3].kafkaTableOptionsUnion() } yyVAL.union = yyLOCAL - case 1692: + case 1710: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.KafkaTableOptions -//line mysql_sql.y:11740 +//line mysql_sql.y:11782 { yyLOCAL = tree.KafkaTableOptions{yyDollar[1].kafkaTableOptionUnion()} } yyVAL.union = yyLOCAL - case 1693: + case 1711: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.KafkaTableOptions -//line mysql_sql.y:11744 +//line mysql_sql.y:11786 { yyLOCAL = append(yyDollar[1].kafkaTableOptionsUnion(), yyDollar[3].kafkaTableOptionUnion()) } yyVAL.union = yyLOCAL - case 1694: + case 1712: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.KafkaTableOption -//line mysql_sql.y:11750 +//line mysql_sql.y:11792 { yyLOCAL = tree.NewKafkaTableOption(tree.Identifier(yyDollar[1].str), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1695: + case 1713: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11756 +//line mysql_sql.y:11798 { yyVAL.str = "esql" } - case 1696: + case 1714: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11760 +//line mysql_sql.y:11802 { yyVAL.str = "sql" } - case 1697: + case 1715: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.ForeignTableOptions -//line mysql_sql.y:11765 +//line mysql_sql.y:11807 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1698: + case 1716: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.ForeignTableOptions -//line mysql_sql.y:11769 +//line mysql_sql.y:11811 { yyLOCAL = yyDollar[3].foreignTableOptionsUnion() } yyVAL.union = yyLOCAL - case 1699: + case 1717: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ForeignTableOptions -//line mysql_sql.y:11775 +//line mysql_sql.y:11817 { yyLOCAL = tree.ForeignTableOptions{yyDollar[1].foreignTableOptionUnion()} } yyVAL.union = yyLOCAL - case 1700: + case 1718: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ForeignTableOptions -//line mysql_sql.y:11779 +//line mysql_sql.y:11821 { yyLOCAL = append(yyDollar[1].foreignTableOptionsUnion(), yyDollar[3].foreignTableOptionUnion()) } yyVAL.union = yyLOCAL - case 1701: + case 1719: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ForeignTableOption -//line mysql_sql.y:11785 +//line mysql_sql.y:11827 { yyLOCAL = tree.NewForeignTableOption(tree.Identifier(yyDollar[1].str), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1702: + case 1720: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11791 +//line mysql_sql.y:11833 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1703: + case 1721: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11795 +//line mysql_sql.y:11837 { yyVAL.str = yyDollar[1].str } - case 1704: + case 1722: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11801 +//line mysql_sql.y:11843 { yyVAL.str = yyDollar[1].cstrUnion().Compare() } - case 1705: + case 1723: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:11805 +//line mysql_sql.y:11847 { yyVAL.str = yyDollar[1].str } - case 1706: + case 1724: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:11810 +//line mysql_sql.y:11852 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1707: + case 1725: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:11814 +//line mysql_sql.y:11856 { yyLOCAL = yyDollar[1].tableOptionsUnion() } yyVAL.union = yyLOCAL - case 1708: + case 1726: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:11820 +//line mysql_sql.y:11862 { yyLOCAL = []tree.TableOption{yyDollar[1].tableOptionUnion()} } yyVAL.union = yyLOCAL - case 1709: + case 1727: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:11824 +//line mysql_sql.y:11866 { yyLOCAL = append(yyDollar[1].tableOptionsUnion(), yyDollar[3].tableOptionUnion()) } yyVAL.union = yyLOCAL - case 1710: + case 1728: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.TableOption -//line mysql_sql.y:11828 +//line mysql_sql.y:11870 { yyLOCAL = append(yyDollar[1].tableOptionsUnion(), yyDollar[2].tableOptionUnion()) } yyVAL.union = yyLOCAL - case 1711: + case 1729: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11834 +//line mysql_sql.y:11876 { yyLOCAL = tree.NewTableOptionAUTOEXTEND_SIZE(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1712: + case 1730: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11838 +//line mysql_sql.y:11880 { yyLOCAL = tree.NewTableOptionAutoIncrement(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1713: + case 1731: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11842 +//line mysql_sql.y:11884 { yyLOCAL = tree.NewTableOptionAutoIDCache(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1714: + case 1732: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11846 +//line mysql_sql.y:11888 { yyLOCAL = tree.NewTableOptionAvgRowLength(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1715: + case 1733: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11850 +//line mysql_sql.y:11892 { yyLOCAL = tree.NewTableOptionCharset(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 1716: + case 1734: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11854 +//line mysql_sql.y:11896 { yyLOCAL = tree.NewTableOptionCollate(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 1717: + case 1735: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11858 +//line mysql_sql.y:11900 { yyLOCAL = tree.NewTableOptionChecksum(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1718: + case 1736: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11862 +//line mysql_sql.y:11904 { str := util.DealCommentString(yyDollar[3].str) yyLOCAL = tree.NewTableOptionComment(str) } yyVAL.union = yyLOCAL - case 1719: + case 1737: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11867 +//line mysql_sql.y:11909 { yyLOCAL = tree.NewTableOptionCompression(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1720: + case 1738: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11871 +//line mysql_sql.y:11913 { yyLOCAL = tree.NewTableOptionConnection(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1721: + case 1739: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11875 +//line mysql_sql.y:11917 { yyLOCAL = tree.NewTableOptionDataDirectory(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 1722: + case 1740: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11879 +//line mysql_sql.y:11921 { yyLOCAL = tree.NewTableOptionIndexDirectory(yyDollar[4].str) } yyVAL.union = yyLOCAL - case 1723: + case 1741: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11883 +//line mysql_sql.y:11925 { yyLOCAL = tree.NewTableOptionDelayKeyWrite(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1724: + case 1742: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11887 +//line mysql_sql.y:11929 { yyLOCAL = tree.NewTableOptionEncryption(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1725: + case 1743: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11891 +//line mysql_sql.y:11933 { yyLOCAL = tree.NewTableOptionEngine(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1726: + case 1744: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11895 +//line mysql_sql.y:11937 { yyLOCAL = tree.NewTableOptionEngineAttr(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1727: + case 1745: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11899 +//line mysql_sql.y:11941 { yyLOCAL = tree.NewTableOptionInsertMethod(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1728: + case 1746: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11903 +//line mysql_sql.y:11945 { yyLOCAL = tree.NewTableOptionKeyBlockSize(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1729: + case 1747: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11907 +//line mysql_sql.y:11949 { yyLOCAL = tree.NewTableOptionMaxRows(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1730: + case 1748: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11911 +//line mysql_sql.y:11953 { yyLOCAL = tree.NewTableOptionMinRows(integralToUint64(yyDollar[3].item)) } yyVAL.union = yyLOCAL - case 1731: + case 1749: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11915 +//line mysql_sql.y:11957 { t := tree.NewTableOptionPackKeys() value, ok := signedIntegral(yylex, yyDollar[3].item) @@ -30348,161 +30557,161 @@ yydefault: yyLOCAL = t } yyVAL.union = yyLOCAL - case 1732: + case 1750: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11923 +//line mysql_sql.y:11965 { t := tree.NewTableOptionPackKeys() t.Default = true yyLOCAL = t } yyVAL.union = yyLOCAL - case 1733: + case 1751: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11929 +//line mysql_sql.y:11971 { yyLOCAL = tree.NewTableOptionPassword(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1734: + case 1752: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11933 +//line mysql_sql.y:11975 { yyLOCAL = tree.NewTableOptionRowFormat(yyDollar[3].rowFormatTypeUnion()) } yyVAL.union = yyLOCAL - case 1735: + case 1753: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11937 +//line mysql_sql.y:11979 { yyLOCAL = tree.NewTTableOptionStartTrans(true) } yyVAL.union = yyLOCAL - case 1736: + case 1754: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11941 +//line mysql_sql.y:11983 { yyLOCAL = tree.NewTTableOptionSecondaryEngineAttr(yyDollar[3].str) } yyVAL.union = yyLOCAL - case 1737: + case 1755: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11945 +//line mysql_sql.y:11987 { t := tree.NewTableOptionStatsAutoRecalc() t.Value = integralToUint64(yyDollar[3].item) yyLOCAL = t } yyVAL.union = yyLOCAL - case 1738: + case 1756: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11951 +//line mysql_sql.y:11993 { t := tree.NewTableOptionStatsAutoRecalc() t.Default = true yyLOCAL = t } yyVAL.union = yyLOCAL - case 1739: + case 1757: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11957 +//line mysql_sql.y:11999 { t := tree.NewTableOptionStatsPersistent() t.Value = integralToUint64(yyDollar[3].item) yyLOCAL = t } yyVAL.union = yyLOCAL - case 1740: + case 1758: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11963 +//line mysql_sql.y:12005 { t := tree.NewTableOptionStatsPersistent() t.Default = true yyLOCAL = t } yyVAL.union = yyLOCAL - case 1741: + case 1759: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11969 +//line mysql_sql.y:12011 { t := tree.NewTableOptionStatsSamplePages() t.Value = integralToUint64(yyDollar[3].item) yyLOCAL = t } yyVAL.union = yyLOCAL - case 1742: + case 1760: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11975 +//line mysql_sql.y:12017 { t := tree.NewTableOptionStatsSamplePages() t.Default = true yyLOCAL = t } yyVAL.union = yyLOCAL - case 1743: + case 1761: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11981 +//line mysql_sql.y:12023 { yyLOCAL = tree.NewTableOptionTablespace(yyDollar[3].cstrUnion().Compare(), "") } yyVAL.union = yyLOCAL - case 1744: + case 1762: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11985 +//line mysql_sql.y:12027 { yyLOCAL = tree.NewTableOptionTablespace("", yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1745: + case 1763: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11989 +//line mysql_sql.y:12031 { yyLOCAL = tree.NewTableOptionUnion(yyDollar[4].tableNamesUnion()) } yyVAL.union = yyLOCAL - case 1746: + case 1764: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.TableOption -//line mysql_sql.y:11993 +//line mysql_sql.y:12035 { var Preperties = yyDollar[3].propertiesUnion() yyLOCAL = tree.NewTableOptionProperties(Preperties) } yyVAL.union = yyLOCAL - case 1747: + case 1765: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.Property -//line mysql_sql.y:12000 +//line mysql_sql.y:12042 { yyLOCAL = []tree.Property{yyDollar[1].propertyUnion()} } yyVAL.union = yyLOCAL - case 1748: + case 1766: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []tree.Property -//line mysql_sql.y:12004 +//line mysql_sql.y:12046 { yyLOCAL = append(yyDollar[1].propertiesUnion(), yyDollar[3].propertyUnion()) } yyVAL.union = yyLOCAL - case 1749: + case 1767: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Property -//line mysql_sql.y:12010 +//line mysql_sql.y:12052 { var Key = yyDollar[1].str var Value = yyDollar[3].str @@ -30512,86 +30721,86 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1750: + case 1768: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:12021 +//line mysql_sql.y:12063 { yyVAL.str = " " + yyDollar[1].str + " " + yyDollar[2].str } - case 1751: + case 1769: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:12025 +//line mysql_sql.y:12067 { yyVAL.str = " " + yyDollar[1].str + " " + yyDollar[2].str } - case 1752: + case 1770: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:12031 +//line mysql_sql.y:12073 { yyLOCAL = tree.ROW_FORMAT_DEFAULT } yyVAL.union = yyLOCAL - case 1753: + case 1771: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:12035 +//line mysql_sql.y:12077 { yyLOCAL = tree.ROW_FORMAT_DYNAMIC } yyVAL.union = yyLOCAL - case 1754: + case 1772: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:12039 +//line mysql_sql.y:12081 { yyLOCAL = tree.ROW_FORMAT_FIXED } yyVAL.union = yyLOCAL - case 1755: + case 1773: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:12043 +//line mysql_sql.y:12085 { yyLOCAL = tree.ROW_FORMAT_COMPRESSED } yyVAL.union = yyLOCAL - case 1756: + case 1774: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:12047 +//line mysql_sql.y:12089 { yyLOCAL = tree.ROW_FORMAT_REDUNDANT } yyVAL.union = yyLOCAL - case 1757: + case 1775: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.RowFormatType -//line mysql_sql.y:12051 +//line mysql_sql.y:12093 { yyLOCAL = tree.ROW_FORMAT_COMPACT } yyVAL.union = yyLOCAL - case 1762: + case 1780: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableNames -//line mysql_sql.y:12065 +//line mysql_sql.y:12107 { yyLOCAL = tree.TableNames{yyDollar[1].tableNameUnion()} } yyVAL.union = yyLOCAL - case 1763: + case 1781: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableNames -//line mysql_sql.y:12069 +//line mysql_sql.y:12111 { yyLOCAL = append(yyDollar[1].tableNamesUnion(), yyDollar[3].tableNameUnion()) } yyVAL.union = yyLOCAL - case 1764: + case 1782: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.TableName -//line mysql_sql.y:12078 +//line mysql_sql.y:12120 { tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) prefix := tree.ObjectNamePrefix{ExplicitSchema: false} @@ -30599,10 +30808,10 @@ yydefault: yyLOCAL.IcebergRef = yyDollar[3].icebergRefSpecUnion() } yyVAL.union = yyLOCAL - case 1765: + case 1783: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.TableName -//line mysql_sql.y:12085 +//line mysql_sql.y:12127 { dbName := yylex.(*Lexer).GetDbOrTblName(yyDollar[1].cstrUnion().Origin()) tblName := yylex.(*Lexer).GetDbOrTblName(yyDollar[3].cstrUnion().Origin()) @@ -30611,85 +30820,85 @@ yydefault: yyLOCAL.IcebergRef = yyDollar[5].icebergRefSpecUnion() } yyVAL.union = yyLOCAL - case 1766: + case 1784: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.IcebergRefSpec -//line mysql_sql.y:12094 +//line mysql_sql.y:12136 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1767: + case 1785: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IcebergRefSpec -//line mysql_sql.y:12098 +//line mysql_sql.y:12140 { raw := fmt.Sprintf("%v", yyDollar[3].item) yyLOCAL = tree.NewIcebergSnapshotRef(tree.NewNumVal(raw, raw, false, tree.P_int64)) } yyVAL.union = yyLOCAL - case 1768: + case 1786: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IcebergRefSpec -//line mysql_sql.y:12103 +//line mysql_sql.y:12145 { yyLOCAL = tree.NewIcebergSnapshotRef(tree.NewNumVal(yyDollar[3].str, yyDollar[3].str, false, tree.P_char)) } yyVAL.union = yyLOCAL - case 1769: + case 1787: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.IcebergRefSpec -//line mysql_sql.y:12107 +//line mysql_sql.y:12149 { yyLOCAL = tree.NewIcebergTimestampRef(tree.NewNumVal(yyDollar[6].str, yyDollar[6].str, false, tree.P_char)) } yyVAL.union = yyLOCAL - case 1770: + case 1788: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.IcebergRefSpec -//line mysql_sql.y:12111 +//line mysql_sql.y:12153 { yyLOCAL = tree.NewIcebergTimestampRef(tree.NewNumVal(yyDollar[5].str, yyDollar[5].str, false, tree.P_char)) } yyVAL.union = yyLOCAL - case 1771: + case 1789: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.IcebergRefSpec -//line mysql_sql.y:12115 +//line mysql_sql.y:12157 { yyLOCAL = tree.NewIcebergNamedRef(tree.Identifier(yyDollar[3].str)) } yyVAL.union = yyLOCAL - case 1772: + case 1790: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:12121 +//line mysql_sql.y:12163 { yyVAL.str = yyDollar[1].str } - case 1773: + case 1791: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:12125 +//line mysql_sql.y:12167 { yyVAL.str = yyDollar[1].str } - case 1774: + case 1792: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:12129 +//line mysql_sql.y:12171 { yyVAL.str = yyDollar[1].str } - case 1775: + case 1793: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:12134 +//line mysql_sql.y:12176 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1776: + case 1794: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:12138 +//line mysql_sql.y:12180 { yyLOCAL = &tree.AtTimeStamp{ Type: tree.ATTIMESTAMPTIME, @@ -30697,10 +30906,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1777: + case 1795: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:12145 +//line mysql_sql.y:12187 { var str = yyDollar[4].cstrUnion().Compare() yyLOCAL = &tree.AtTimeStamp{ @@ -30710,10 +30919,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1778: + case 1796: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:12154 +//line mysql_sql.y:12196 { yyLOCAL = &tree.AtTimeStamp{ Type: tree.ATTIMESTAMPSNAPSHOT, @@ -30722,10 +30931,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1779: + case 1797: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:12162 +//line mysql_sql.y:12204 { yyLOCAL = &tree.AtTimeStamp{ Type: tree.ATMOTIMESTAMP, @@ -30733,10 +30942,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1780: + case 1798: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.AtTimeStamp -//line mysql_sql.y:12169 +//line mysql_sql.y:12211 { yyLOCAL = &tree.AtTimeStamp{ Type: tree.ASOFTIMESTAMP, @@ -30744,74 +30953,74 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1781: + case 1799: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.TableDefs -//line mysql_sql.y:12177 +//line mysql_sql.y:12219 { yyLOCAL = tree.TableDefs(nil) } yyVAL.union = yyLOCAL - case 1783: + case 1801: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDefs -//line mysql_sql.y:12184 +//line mysql_sql.y:12226 { yyLOCAL = tree.TableDefs{yyDollar[1].tableDefUnion()} } yyVAL.union = yyLOCAL - case 1784: + case 1802: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.TableDefs -//line mysql_sql.y:12188 +//line mysql_sql.y:12230 { yyLOCAL = append(yyDollar[1].tableDefsUnion(), yyDollar[3].tableDefUnion()) } yyVAL.union = yyLOCAL - case 1785: + case 1803: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12194 +//line mysql_sql.y:12236 { yyLOCAL = tree.TableDef(yyDollar[1].columnTableDefUnion()) } yyVAL.union = yyLOCAL - case 1786: + case 1804: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12198 +//line mysql_sql.y:12240 { yyLOCAL = yyDollar[1].tableDefUnion() } yyVAL.union = yyLOCAL - case 1787: + case 1805: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12202 +//line mysql_sql.y:12244 { yyLOCAL = yyDollar[1].tableDefUnion() } yyVAL.union = yyLOCAL - case 1788: + case 1806: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12208 +//line mysql_sql.y:12250 { yyLOCAL = yyDollar[1].tableDefUnion() } yyVAL.union = yyLOCAL - case 1789: + case 1807: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12212 +//line mysql_sql.y:12254 { yyLOCAL = yyDollar[1].tableDefUnion() } yyVAL.union = yyLOCAL - case 1790: + case 1808: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12218 +//line mysql_sql.y:12260 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].str @@ -30825,10 +31034,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1791: + case 1809: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12231 +//line mysql_sql.y:12273 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].str @@ -30842,10 +31051,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1792: + case 1810: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12244 +//line mysql_sql.y:12286 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].str @@ -30861,10 +31070,10 @@ yydefault: yyLOCAL = fti } yyVAL.union = yyLOCAL - case 1793: + case 1811: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12259 +//line mysql_sql.y:12301 { keyTyp := tree.INDEX_TYPE_INVALID if yyDollar[3].strsUnion()[1] != "" { @@ -30910,10 +31119,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1794: + case 1812: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12304 +//line mysql_sql.y:12346 { keyTyp := tree.INDEX_TYPE_INVALID if yyDollar[3].strsUnion()[1] != "" { @@ -30958,10 +31167,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1795: + case 1813: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12349 +//line mysql_sql.y:12391 { if yyDollar[1].str != "" { switch v := yyDollar[2].tableDefUnion().(type) { @@ -30978,18 +31187,18 @@ yydefault: yyLOCAL = yyDollar[2].tableDefUnion() } yyVAL.union = yyLOCAL - case 1796: + case 1814: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12364 +//line mysql_sql.y:12406 { yyLOCAL = yyDollar[1].tableDefUnion() } yyVAL.union = yyLOCAL - case 1797: + case 1815: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12370 +//line mysql_sql.y:12412 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].strsUnion()[0] @@ -31003,10 +31212,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1798: + case 1816: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12383 +//line mysql_sql.y:12425 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].strsUnion()[0] @@ -31020,10 +31229,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1799: + case 1817: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12396 +//line mysql_sql.y:12438 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].strsUnion()[0] @@ -31037,10 +31246,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1800: + case 1818: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12409 +//line mysql_sql.y:12451 { var KeyParts = yyDollar[5].keyPartsUnion() var Name = yyDollar[3].strsUnion()[0] @@ -31054,10 +31263,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1801: + case 1819: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12422 +//line mysql_sql.y:12464 { var IfNotExists = yyDollar[3].ifNotExistsUnion() var KeyParts = yyDollar[6].keyPartsUnion() @@ -31073,10 +31282,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1802: + case 1820: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.TableDef -//line mysql_sql.y:12437 +//line mysql_sql.y:12479 { var Expr = yyDollar[3].exprUnion() var Enforced = yyDollar[5].boolValUnion() @@ -31086,107 +31295,107 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1803: + case 1821: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:12447 +//line mysql_sql.y:12489 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1805: + case 1823: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:12453 +//line mysql_sql.y:12495 { yyVAL.str = "" } - case 1806: + case 1824: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:12457 +//line mysql_sql.y:12499 { yyVAL.str = yyDollar[1].str } - case 1809: + case 1827: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:12467 +//line mysql_sql.y:12509 { yyLOCAL = make([]string, 2) yyLOCAL[0] = yyDollar[1].str yyLOCAL[1] = "" } yyVAL.union = yyLOCAL - case 1810: + case 1828: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:12473 +//line mysql_sql.y:12515 { yyLOCAL = make([]string, 2) yyLOCAL[0] = yyDollar[1].str yyLOCAL[1] = yyDollar[3].str } yyVAL.union = yyLOCAL - case 1811: + case 1829: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:12479 +//line mysql_sql.y:12521 { yyLOCAL = make([]string, 2) yyLOCAL[0] = yyDollar[1].cstrUnion().Origin() yyLOCAL[1] = yyDollar[3].str } yyVAL.union = yyLOCAL - case 1826: + case 1844: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:12504 +//line mysql_sql.y:12546 { yyVAL.str = "" } - case 1827: + case 1845: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:12508 +//line mysql_sql.y:12550 { yyVAL.str = yyDollar[1].cstrUnion().Origin() } - case 1828: + case 1846: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.ColumnTableDef -//line mysql_sql.y:12514 +//line mysql_sql.y:12556 { yyLOCAL = tree.NewColumnTableDef(yyDollar[1].unresolvedNameUnion(), yyDollar[2].columnTypeUnion(), yyDollar[3].columnAttributesUnion()) } yyVAL.union = yyLOCAL - case 1829: + case 1847: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:12520 +//line mysql_sql.y:12562 { yyLOCAL = tree.NewUnresolvedName(yyDollar[1].cstrUnion()) } yyVAL.union = yyLOCAL - case 1830: + case 1848: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:12524 +//line mysql_sql.y:12566 { tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(tblNameCStr, yyDollar[3].cstrUnion()) } yyVAL.union = yyLOCAL - case 1831: + case 1849: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:12529 +//line mysql_sql.y:12571 { dbNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[3].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(dbNameCStr, tblNameCStr, yyDollar[5].cstrUnion()) } yyVAL.union = yyLOCAL - case 1832: + case 1850: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:12537 +//line mysql_sql.y:12579 { if rejectSQLModeReservedFunctionName(yylex, yyDollar[1].str) { goto ret1 @@ -31194,18 +31403,18 @@ yydefault: yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1833: + case 1851: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:12541 +//line mysql_sql.y:12583 { yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1834: + case 1852: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:12545 +//line mysql_sql.y:12587 { if rejectSQLModeReservedFunctionName(yylex, yyDollar[1].str) { goto ret1 @@ -31213,10 +31422,10 @@ yydefault: yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1835: + case 1853: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:12549 +//line mysql_sql.y:12591 { if rejectSQLModeReservedFunctionName(yylex, yyDollar[1].str) { goto ret1 @@ -31224,222 +31433,222 @@ yydefault: yyLOCAL = tree.NewCStr(yyDollar[1].str, 1) } yyVAL.union = yyLOCAL - case 1836: + case 1854: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:12555 +//line mysql_sql.y:12597 { yyLOCAL = yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) } yyVAL.union = yyLOCAL - case 1837: + case 1855: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:12561 +//line mysql_sql.y:12603 { yyLOCAL = tree.NewUnresolvedName(yyDollar[1].cstrUnion()) } yyVAL.union = yyLOCAL - case 1838: + case 1856: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:12565 +//line mysql_sql.y:12607 { tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(tblNameCStr, yyDollar[3].cstrUnion()) } yyVAL.union = yyLOCAL - case 1839: + case 1857: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.UnresolvedName -//line mysql_sql.y:12570 +//line mysql_sql.y:12612 { dbNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[1].cstrUnion().Origin()) tblNameCStr := yylex.(*Lexer).GetDbOrTblNameCStr(yyDollar[3].cstrUnion().Origin()) yyLOCAL = tree.NewUnresolvedName(dbNameCStr, tblNameCStr, yyDollar[5].cstrUnion()) } yyVAL.union = yyLOCAL - case 1840: + case 1858: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []tree.ColumnAttribute -//line mysql_sql.y:12577 +//line mysql_sql.y:12619 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1841: + case 1859: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.ColumnAttribute -//line mysql_sql.y:12581 +//line mysql_sql.y:12623 { yyLOCAL = yyDollar[1].columnAttributesUnion() } yyVAL.union = yyLOCAL - case 1842: + case 1860: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []tree.ColumnAttribute -//line mysql_sql.y:12587 +//line mysql_sql.y:12629 { yyLOCAL = []tree.ColumnAttribute{yyDollar[1].columnAttributeUnion()} } yyVAL.union = yyLOCAL - case 1843: + case 1861: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []tree.ColumnAttribute -//line mysql_sql.y:12591 +//line mysql_sql.y:12633 { yyLOCAL = append(yyDollar[1].columnAttributesUnion(), yyDollar[2].columnAttributeUnion()) } yyVAL.union = yyLOCAL - case 1844: + case 1862: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12597 +//line mysql_sql.y:12639 { yyLOCAL = tree.NewAttributeNull(true) } yyVAL.union = yyLOCAL - case 1845: + case 1863: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12601 +//line mysql_sql.y:12643 { yyLOCAL = tree.NewAttributeNull(false) } yyVAL.union = yyLOCAL - case 1846: + case 1864: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12605 +//line mysql_sql.y:12647 { yyLOCAL = tree.NewAttributeNull(false) } yyVAL.union = yyLOCAL - case 1847: + case 1865: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12609 +//line mysql_sql.y:12651 { yyLOCAL = tree.NewAttributeDefault(yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1848: + case 1866: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12613 +//line mysql_sql.y:12655 { yyLOCAL = tree.NewAttributeAutoIncrement() } yyVAL.union = yyLOCAL - case 1849: + case 1867: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12617 +//line mysql_sql.y:12659 { yyLOCAL = yyDollar[1].columnAttributeUnion() } yyVAL.union = yyLOCAL - case 1850: + case 1868: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12621 +//line mysql_sql.y:12663 { str := util.DealCommentString(yyDollar[2].str) yyLOCAL = tree.NewAttributeComment(tree.NewNumVal(str, str, false, tree.P_char)) } yyVAL.union = yyLOCAL - case 1851: + case 1869: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12626 +//line mysql_sql.y:12668 { yyLOCAL = tree.NewAttributeMongoDBPath(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1852: + case 1870: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12630 +//line mysql_sql.y:12672 { yyLOCAL = tree.NewAttributeMongoDBConvert(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1853: + case 1871: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12634 +//line mysql_sql.y:12676 { yyLOCAL = tree.NewAttributeCollate(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1854: + case 1872: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12638 +//line mysql_sql.y:12680 { yyLOCAL = tree.NewAttributeColumnFormat(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1855: + case 1873: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12642 +//line mysql_sql.y:12684 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1856: + case 1874: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12646 +//line mysql_sql.y:12688 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1857: + case 1875: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12650 +//line mysql_sql.y:12692 { yyLOCAL = tree.NewAttributeStorage(yyDollar[2].str) } yyVAL.union = yyLOCAL - case 1858: + case 1876: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12654 +//line mysql_sql.y:12696 { yyLOCAL = tree.NewAttributeAutoRandom(int(yyDollar[2].int64ValUnion())) } yyVAL.union = yyLOCAL - case 1859: + case 1877: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12658 +//line mysql_sql.y:12700 { yyLOCAL = yyDollar[1].attributeReferenceUnion() } yyVAL.union = yyLOCAL - case 1860: + case 1878: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12662 +//line mysql_sql.y:12704 { yyLOCAL = tree.NewAttributeCheckConstraint(yyDollar[4].exprUnion(), true, yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1861: + case 1879: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12666 +//line mysql_sql.y:12708 { yyLOCAL = tree.NewAttributeCheckConstraint(yyDollar[4].exprUnion(), yyDollar[6].boolValUnion(), yyDollar[1].str) } yyVAL.union = yyLOCAL - case 1862: + case 1880: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12670 +//line mysql_sql.y:12712 { name := tree.NewUnresolvedColName(yyDollar[3].str) var es tree.Exprs = nil @@ -31454,10 +31663,10 @@ yydefault: yyLOCAL = tree.NewAttributeOnUpdate(expr) } yyVAL.union = yyLOCAL - case 1863: + case 1881: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12684 +//line mysql_sql.y:12726 { v, errStr := util.GetInt64(yyDollar[2].item) if errStr != "" { @@ -31471,130 +31680,130 @@ yydefault: yyLOCAL = tree.NewAttributeSRID(uint32(v)) } yyVAL.union = yyLOCAL - case 1864: + case 1882: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12697 +//line mysql_sql.y:12739 { yyLOCAL = tree.NewAttributeLowCardinality() } yyVAL.union = yyLOCAL - case 1865: + case 1883: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12701 +//line mysql_sql.y:12743 { yyLOCAL = tree.NewAttributeVisable(true) } yyVAL.union = yyLOCAL - case 1866: + case 1884: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12705 +//line mysql_sql.y:12747 { yyLOCAL = tree.NewAttributeVisable(false) } yyVAL.union = yyLOCAL - case 1867: + case 1885: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12709 +//line mysql_sql.y:12751 { yyLOCAL = tree.NewAttributeCharset(yyDollar[5].str) } yyVAL.union = yyLOCAL - case 1868: + case 1886: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12713 +//line mysql_sql.y:12755 { yyLOCAL = tree.NewAttributeGeneratedAlways(yyDollar[5].exprUnion(), yyDollar[7].boolValUnion()) } yyVAL.union = yyLOCAL - case 1869: + case 1887: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:12717 +//line mysql_sql.y:12759 { yyLOCAL = tree.NewAttributeGeneratedAlways(yyDollar[3].exprUnion(), yyDollar[5].boolValUnion()) } yyVAL.union = yyLOCAL - case 1870: + case 1888: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:12722 +//line mysql_sql.y:12764 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1871: + case 1889: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:12726 +//line mysql_sql.y:12768 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1872: + case 1890: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:12730 +//line mysql_sql.y:12772 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1873: + case 1891: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:12736 +//line mysql_sql.y:12778 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 1874: + case 1892: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:12740 +//line mysql_sql.y:12782 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1875: + case 1893: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:12744 +//line mysql_sql.y:12786 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 1876: + case 1894: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:12749 +//line mysql_sql.y:12791 { yyVAL.str = "" } - case 1877: + case 1895: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:12753 +//line mysql_sql.y:12795 { yyVAL.str = yyDollar[1].str } - case 1878: + case 1896: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:12759 +//line mysql_sql.y:12801 { yyVAL.str = "" } - case 1879: + case 1897: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:12763 +//line mysql_sql.y:12805 { yyVAL.str = yyDollar[2].cstrUnion().Compare() } - case 1880: + case 1898: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.AttributeReference -//line mysql_sql.y:12769 +//line mysql_sql.y:12811 { var TableName = yyDollar[2].tableNameUnion() var KeyParts = yyDollar[3].keyPartsUnion() @@ -31610,10 +31819,10 @@ yydefault: ) } yyVAL.union = yyLOCAL - case 1881: + case 1899: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.ReferenceOnRecord -//line mysql_sql.y:12786 +//line mysql_sql.y:12828 { yyLOCAL = &tree.ReferenceOnRecord{ OnDelete: tree.REFERENCE_OPTION_INVALID, @@ -31621,10 +31830,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1882: + case 1900: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.ReferenceOnRecord -//line mysql_sql.y:12793 +//line mysql_sql.y:12835 { yyLOCAL = &tree.ReferenceOnRecord{ OnDelete: yyDollar[1].referenceOptionTypeUnion(), @@ -31632,10 +31841,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1883: + case 1901: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.ReferenceOnRecord -//line mysql_sql.y:12800 +//line mysql_sql.y:12842 { yyLOCAL = &tree.ReferenceOnRecord{ OnDelete: tree.REFERENCE_OPTION_INVALID, @@ -31643,10 +31852,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1884: + case 1902: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ReferenceOnRecord -//line mysql_sql.y:12807 +//line mysql_sql.y:12849 { yyLOCAL = &tree.ReferenceOnRecord{ OnDelete: yyDollar[1].referenceOptionTypeUnion(), @@ -31654,10 +31863,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1885: + case 1903: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.ReferenceOnRecord -//line mysql_sql.y:12814 +//line mysql_sql.y:12856 { yyLOCAL = &tree.ReferenceOnRecord{ OnDelete: yyDollar[2].referenceOptionTypeUnion(), @@ -31665,170 +31874,170 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1886: + case 1904: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:12823 +//line mysql_sql.y:12865 { yyLOCAL = yyDollar[3].referenceOptionTypeUnion() } yyVAL.union = yyLOCAL - case 1887: + case 1905: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:12829 +//line mysql_sql.y:12871 { yyLOCAL = yyDollar[3].referenceOptionTypeUnion() } yyVAL.union = yyLOCAL - case 1888: + case 1906: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:12835 +//line mysql_sql.y:12877 { yyLOCAL = tree.REFERENCE_OPTION_RESTRICT } yyVAL.union = yyLOCAL - case 1889: + case 1907: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:12839 +//line mysql_sql.y:12881 { yyLOCAL = tree.REFERENCE_OPTION_CASCADE } yyVAL.union = yyLOCAL - case 1890: + case 1908: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:12843 +//line mysql_sql.y:12885 { yyLOCAL = tree.REFERENCE_OPTION_SET_NULL } yyVAL.union = yyLOCAL - case 1891: + case 1909: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:12847 +//line mysql_sql.y:12889 { yyLOCAL = tree.REFERENCE_OPTION_NO_ACTION } yyVAL.union = yyLOCAL - case 1892: + case 1910: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ReferenceOptionType -//line mysql_sql.y:12851 +//line mysql_sql.y:12893 { yyLOCAL = tree.REFERENCE_OPTION_SET_DEFAULT } yyVAL.union = yyLOCAL - case 1893: + case 1911: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.MatchType -//line mysql_sql.y:12856 +//line mysql_sql.y:12898 { yyLOCAL = tree.MATCH_INVALID } yyVAL.union = yyLOCAL - case 1895: + case 1913: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.MatchType -//line mysql_sql.y:12863 +//line mysql_sql.y:12905 { yyLOCAL = tree.MATCH_FULL } yyVAL.union = yyLOCAL - case 1896: + case 1914: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.MatchType -//line mysql_sql.y:12867 +//line mysql_sql.y:12909 { yyLOCAL = tree.MATCH_PARTIAL } yyVAL.union = yyLOCAL - case 1897: + case 1915: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.MatchType -//line mysql_sql.y:12871 +//line mysql_sql.y:12913 { yyLOCAL = tree.MATCH_SIMPLE } yyVAL.union = yyLOCAL - case 1898: + case 1916: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:12876 +//line mysql_sql.y:12918 { yyLOCAL = tree.FULLTEXT_DEFAULT } yyVAL.union = yyLOCAL - case 1899: + case 1917: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:12880 +//line mysql_sql.y:12922 { yyLOCAL = tree.FULLTEXT_NL } yyVAL.union = yyLOCAL - case 1900: + case 1918: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:12884 +//line mysql_sql.y:12926 { yyLOCAL = tree.FULLTEXT_NL_QUERY_EXPANSION } yyVAL.union = yyLOCAL - case 1901: + case 1919: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:12888 +//line mysql_sql.y:12930 { yyLOCAL = tree.FULLTEXT_BOOLEAN } yyVAL.union = yyLOCAL - case 1902: + case 1920: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:12892 +//line mysql_sql.y:12934 { yyLOCAL = tree.FULLTEXT_QUERY_EXPANSION } yyVAL.union = yyLOCAL - case 1903: + case 1921: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.FullTextSearchType -//line mysql_sql.y:12896 +//line mysql_sql.y:12938 { yyLOCAL = tree.FULLTEXT_BM25 } yyVAL.union = yyLOCAL - case 1904: + case 1922: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL []*tree.KeyPart -//line mysql_sql.y:12901 +//line mysql_sql.y:12943 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1905: + case 1923: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []*tree.KeyPart -//line mysql_sql.y:12905 +//line mysql_sql.y:12947 { yyLOCAL = yyDollar[2].keyPartsUnion() } yyVAL.union = yyLOCAL - case 1906: + case 1924: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:12910 +//line mysql_sql.y:12952 { yyLOCAL = -1 } yyVAL.union = yyLOCAL - case 1907: + case 1925: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int64 -//line mysql_sql.y:12914 +//line mysql_sql.y:12956 { value, ok := signedIntegral(yylex, yyDollar[2].item) if !ok { @@ -31837,114 +32046,114 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 1914: + case 1932: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.Subquery -//line mysql_sql.y:12932 +//line mysql_sql.y:12974 { yyLOCAL = &tree.Subquery{Select: yyDollar[1].selectStatementUnion(), Exists: false} } yyVAL.union = yyLOCAL - case 1915: + case 1933: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12938 +//line mysql_sql.y:12980 { yyLOCAL = tree.NewBinaryExpr(tree.BIT_AND, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1916: + case 1934: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12942 +//line mysql_sql.y:12984 { yyLOCAL = tree.NewBinaryExpr(tree.BIT_OR, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1917: + case 1935: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12946 +//line mysql_sql.y:12988 { yyLOCAL = tree.NewBinaryExpr(tree.BIT_XOR, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1918: + case 1936: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12950 +//line mysql_sql.y:12992 { yyLOCAL = tree.NewBinaryExpr(tree.PLUS, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1919: + case 1937: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12954 +//line mysql_sql.y:12996 { yyLOCAL = tree.NewBinaryExpr(tree.MINUS, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1920: + case 1938: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12958 +//line mysql_sql.y:13000 { yyLOCAL = tree.NewBinaryExpr(tree.MULTI, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1921: + case 1939: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12962 +//line mysql_sql.y:13004 { yyLOCAL = tree.NewBinaryExpr(tree.DIV, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1922: + case 1940: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12966 +//line mysql_sql.y:13008 { yyLOCAL = tree.NewBinaryExpr(tree.INTEGER_DIV, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1923: + case 1941: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12970 +//line mysql_sql.y:13012 { yyLOCAL = tree.NewBinaryExpr(tree.MOD, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1924: + case 1942: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12974 +//line mysql_sql.y:13016 { yyLOCAL = tree.NewBinaryExpr(tree.MOD, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1925: + case 1943: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12978 +//line mysql_sql.y:13020 { yyLOCAL = tree.NewBinaryExpr(tree.LEFT_SHIFT, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1926: + case 1944: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12982 +//line mysql_sql.y:13024 { yyLOCAL = tree.NewBinaryExpr(tree.RIGHT_SHIFT, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 1927: + case 1945: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12986 +//line mysql_sql.y:13028 { name := tree.NewUnresolvedColName("json_extract") yyLOCAL = &tree.FuncExpr{ @@ -31954,10 +32163,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1928: + case 1946: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:12995 +//line mysql_sql.y:13037 { extractName := tree.NewUnresolvedColName("json_extract") inner := &tree.FuncExpr{ @@ -31973,42 +32182,42 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1929: + case 1947: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13010 +//line mysql_sql.y:13052 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1930: + case 1948: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13016 +//line mysql_sql.y:13058 { yyLOCAL = yyDollar[1].unresolvedNameUnion() } yyVAL.union = yyLOCAL - case 1931: + case 1949: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13020 +//line mysql_sql.y:13062 { yyLOCAL = yyDollar[1].varExprUnion() } yyVAL.union = yyLOCAL - case 1932: + case 1950: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13024 +//line mysql_sql.y:13066 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1933: + case 1951: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13028 +//line mysql_sql.y:13070 { name := tree.NewUnresolvedColName("concat") yyLOCAL = &tree.FuncExpr{ @@ -32018,66 +32227,66 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1934: + case 1952: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13037 +//line mysql_sql.y:13079 { yyLOCAL = tree.NewParentExpr(yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1935: + case 1953: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13041 +//line mysql_sql.y:13083 { yyLOCAL = tree.NewTuple(append(yyDollar[2].exprsUnion(), yyDollar[4].exprUnion())) } yyVAL.union = yyLOCAL - case 1936: + case 1954: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13045 +//line mysql_sql.y:13087 { yyLOCAL = tree.NewUnaryExpr(tree.UNARY_PLUS, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1937: + case 1955: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13049 +//line mysql_sql.y:13091 { yyLOCAL = tree.NewUnaryExpr(tree.UNARY_MINUS, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1938: + case 1956: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13053 +//line mysql_sql.y:13095 { yyLOCAL = tree.NewUnaryExpr(tree.UNARY_TILDE, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1939: + case 1957: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13057 +//line mysql_sql.y:13099 { yyLOCAL = tree.NewUnaryExpr(tree.UNARY_MARK, yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1940: + case 1958: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13061 +//line mysql_sql.y:13103 { yyLOCAL = tree.NewNotExpr(yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 1941: + case 1959: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13065 +//line mysql_sql.y:13107 { hint := strings.ToLower(yyDollar[2].cstrUnion().Compare()) switch hint { @@ -32120,35 +32329,35 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1942: + case 1960: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13107 +//line mysql_sql.y:13149 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1943: + case 1961: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13111 +//line mysql_sql.y:13153 { yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL - case 1944: + case 1962: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13115 +//line mysql_sql.y:13157 { yyDollar[2].subqueryUnion().Exists = true yyLOCAL = yyDollar[2].subqueryUnion() } yyVAL.union = yyLOCAL - case 1945: + case 1963: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13120 +//line mysql_sql.y:13162 { yyLOCAL = &tree.CaseExpr{ Expr: yyDollar[2].exprUnion(), @@ -32157,58 +32366,58 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1946: + case 1964: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13128 +//line mysql_sql.y:13170 { yyLOCAL = tree.NewCastExpr(yyDollar[3].exprUnion(), yyDollar[5].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1947: + case 1965: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13132 +//line mysql_sql.y:13174 { yyLOCAL = tree.NewCastExpr(yyDollar[3].exprUnion(), makeCharsetCastCharType(yyDollar[6].lengthOptUnion(), yyDollar[9].str)) } yyVAL.union = yyLOCAL - case 1948: + case 1966: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13136 +//line mysql_sql.y:13178 { yyLOCAL = tree.NewSerialExtractExpr(yyDollar[3].exprUnion(), yyDollar[5].exprUnion(), yyDollar[7].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1949: + case 1967: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13140 +//line mysql_sql.y:13182 { yyLOCAL = tree.NewBitCastExpr(yyDollar[3].exprUnion(), yyDollar[5].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1950: + case 1968: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13144 +//line mysql_sql.y:13186 { yyLOCAL = tree.NewCastExpr(yyDollar[1].exprUnion(), yyDollar[3].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1951: + case 1969: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13148 +//line mysql_sql.y:13190 { yyLOCAL = tree.NewCastExpr(yyDollar[3].exprUnion(), yyDollar[5].columnTypeUnion()) } yyVAL.union = yyLOCAL - case 1952: + case 1970: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13152 +//line mysql_sql.y:13194 { name := tree.NewUnresolvedColName(yyDollar[1].str) es := tree.NewNumVal(yyDollar[5].str, yyDollar[5].str, false, tree.P_char) @@ -32219,66 +32428,66 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1953: + case 1971: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13162 +//line mysql_sql.y:13204 { yyLOCAL = yyDollar[1].funcExprUnion() } yyVAL.union = yyLOCAL - case 1954: + case 1972: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13166 +//line mysql_sql.y:13208 { yyLOCAL = yyDollar[1].funcExprUnion() } yyVAL.union = yyLOCAL - case 1955: + case 1973: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13170 +//line mysql_sql.y:13212 { yyLOCAL = yyDollar[1].funcExprUnion() } yyVAL.union = yyLOCAL - case 1956: + case 1974: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13174 +//line mysql_sql.y:13216 { yyLOCAL = yyDollar[1].funcExprUnion() } yyVAL.union = yyLOCAL - case 1957: + case 1975: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13178 +//line mysql_sql.y:13220 { yyLOCAL = yyDollar[1].funcExprUnion() } yyVAL.union = yyLOCAL - case 1958: + case 1976: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13182 +//line mysql_sql.y:13224 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1959: + case 1977: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13186 +//line mysql_sql.y:13228 { yyLOCAL = &tree.CollateExpr{Expr: yyDollar[1].exprUnion(), Collation: yyDollar[3].str} } yyVAL.union = yyLOCAL - case 1960: + case 1978: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13190 +//line mysql_sql.y:13232 { val, err := tree.NewFullTextMatchFuncExpression(yyDollar[3].keyPartsUnion(), yyDollar[7].exprUnion(), yyDollar[8].fullTextSearchTypeUnion()) if err != nil { @@ -32288,34 +32497,34 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1961: + case 1979: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13200 +//line mysql_sql.y:13242 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_char) } yyVAL.union = yyLOCAL - case 1962: + case 1980: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13204 +//line mysql_sql.y:13246 { yyLOCAL = tree.NewParamExpr(yylex.(*Lexer).GetParamIndex()) } yyVAL.union = yyLOCAL - case 1963: + case 1981: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13208 +//line mysql_sql.y:13250 { yyLOCAL = tree.NewUnresolvedName(yyDollar[1].cstrUnion()) } yyVAL.union = yyLOCAL - case 1964: + case 1982: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13214 +//line mysql_sql.y:13256 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32325,10 +32534,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1965: + case 1983: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13223 +//line mysql_sql.y:13265 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32338,10 +32547,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1966: + case 1984: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13232 +//line mysql_sql.y:13274 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32351,10 +32560,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1967: + case 1985: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13241 +//line mysql_sql.y:13283 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32364,10 +32573,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1968: + case 1986: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13250 +//line mysql_sql.y:13292 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32378,10 +32587,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1969: + case 1987: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13260 +//line mysql_sql.y:13302 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32391,10 +32600,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1970: + case 1988: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13269 +//line mysql_sql.y:13311 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32405,10 +32614,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1971: + case 1989: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13279 +//line mysql_sql.y:13321 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32419,10 +32628,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1972: + case 1990: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13289 +//line mysql_sql.y:13331 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32433,10 +32642,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1973: + case 1991: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13299 +//line mysql_sql.y:13341 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32447,10 +32656,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1974: + case 1992: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13309 +//line mysql_sql.y:13351 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32461,10 +32670,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1975: + case 1993: yyDollar = yyS[yypt-10 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13319 +//line mysql_sql.y:13361 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32475,10 +32684,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1976: + case 1994: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13329 +//line mysql_sql.y:13371 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32489,10 +32698,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1977: + case 1995: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13339 +//line mysql_sql.y:13381 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32503,10 +32712,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1978: + case 1996: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13349 +//line mysql_sql.y:13391 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -32517,10 +32726,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1979: + case 1997: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13361 +//line mysql_sql.y:13403 { value, ok := signedIntegral(yylex, yyDollar[5].item) if !ok { @@ -32535,10 +32744,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1980: + case 1998: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13373 +//line mysql_sql.y:13415 { value, ok := signedIntegral(yylex, yyDollar[5].item) if !ok { @@ -32553,10 +32762,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1981: + case 1999: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13385 +//line mysql_sql.y:13427 { value, ok := signedIntegral(yylex, yyDollar[5].item) if !ok { @@ -32570,10 +32779,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1982: + case 2000: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13396 +//line mysql_sql.y:13438 { val, err := tree.NewSamplePercentFuncExpression2(yyDollar[5].item.(float64), true, nil) if err != nil { @@ -32583,10 +32792,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1983: + case 2001: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13406 +//line mysql_sql.y:13448 { value, ok := signedIntegral(yylex, yyDollar[5].item) if !ok { @@ -32601,10 +32810,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1984: + case 2002: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13418 +//line mysql_sql.y:13460 { value, ok := signedIntegral(yylex, yyDollar[5].item) if !ok { @@ -32619,10 +32828,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1985: + case 2003: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13430 +//line mysql_sql.y:13472 { value, ok := signedIntegral(yylex, yyDollar[5].item) if !ok { @@ -32636,10 +32845,10 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1986: + case 2004: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13441 +//line mysql_sql.y:13483 { val, err := tree.NewSamplePercentFuncExpression2(yyDollar[5].item.(float64), false, yyDollar[3].exprsUnion()) if err != nil { @@ -32649,58 +32858,58 @@ yydefault: yyLOCAL = val } yyVAL.union = yyLOCAL - case 1987: + case 2005: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13451 +//line mysql_sql.y:13493 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1988: + case 2006: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13455 +//line mysql_sql.y:13497 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 1989: + case 2007: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13460 +//line mysql_sql.y:13502 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 1990: + case 2008: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:13464 +//line mysql_sql.y:13506 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 1991: + case 2009: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []*tree.When -//line mysql_sql.y:13470 +//line mysql_sql.y:13512 { yyLOCAL = []*tree.When{yyDollar[1].whenClauseUnion()} } yyVAL.union = yyLOCAL - case 1992: + case 2010: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL []*tree.When -//line mysql_sql.y:13474 +//line mysql_sql.y:13516 { yyLOCAL = append(yyDollar[1].whenClauseListUnion(), yyDollar[2].whenClauseUnion()) } yyVAL.union = yyLOCAL - case 1993: + case 2011: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.When -//line mysql_sql.y:13480 +//line mysql_sql.y:13522 { yyLOCAL = &tree.When{ Cond: yyDollar[2].exprUnion(), @@ -32708,9 +32917,9 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1994: + case 2012: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:13489 +//line mysql_sql.y:13531 { t := yyVAL.columnTypeUnion() str := strings.ToLower(t.InternalType.FamilyString) @@ -32723,10 +32932,10 @@ yydefault: } } } - case 1995: + case 2013: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13501 +//line mysql_sql.y:13543 { name := yyDollar[1].str if yyDollar[2].str != "" { @@ -32744,10 +32953,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1996: + case 2014: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13518 +//line mysql_sql.y:13560 { locale := "" yyLOCAL = &tree.T{ @@ -32762,10 +32971,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1998: + case 2016: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13535 +//line mysql_sql.y:13577 { locale := "" yyLOCAL = &tree.T{ @@ -32778,10 +32987,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 1999: + case 2017: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13547 +//line mysql_sql.y:13589 { locale := "" yyLOCAL = &tree.T{ @@ -32796,10 +33005,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2000: + case 2018: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13561 +//line mysql_sql.y:13603 { locale := "" oid := uint32(defines.MYSQL_TYPE_STRING) @@ -32819,18 +33028,18 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2001: + case 2019: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13580 +//line mysql_sql.y:13622 { yyLOCAL = makeCharsetCastCharType(yyDollar[2].lengthOptUnion(), yyDollar[5].str) } yyVAL.union = yyLOCAL - case 2002: + case 2020: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13584 +//line mysql_sql.y:13626 { locale := "" yyLOCAL = &tree.T{ @@ -32843,10 +33052,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2003: + case 2021: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13596 +//line mysql_sql.y:13638 { locale := "" yyLOCAL = &tree.T{ @@ -32861,10 +33070,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2004: + case 2022: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13610 +//line mysql_sql.y:13652 { locale := "" yyLOCAL = &tree.T{ @@ -32880,10 +33089,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2005: + case 2023: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13625 +//line mysql_sql.y:13667 { locale := "" yyLOCAL = &tree.T{ @@ -32899,10 +33108,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2006: + case 2024: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13640 +//line mysql_sql.y:13682 { name := yyDollar[1].str if yyDollar[2].str != "" { @@ -32920,10 +33129,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2007: + case 2025: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:13657 +//line mysql_sql.y:13699 { locale := "" yyLOCAL = &tree.T{ @@ -32938,112 +33147,112 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2008: + case 2026: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:13673 +//line mysql_sql.y:13715 { yyVAL.str = "" } - case 2012: + case 2030: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13682 +//line mysql_sql.y:13724 { yyLOCAL = &tree.FrameBound{Type: tree.Following, UnBounded: true} } yyVAL.union = yyLOCAL - case 2013: + case 2031: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13686 +//line mysql_sql.y:13728 { yyLOCAL = &tree.FrameBound{Type: tree.Following, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 2014: + case 2032: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13690 +//line mysql_sql.y:13732 { yyLOCAL = &tree.FrameBound{Type: tree.Following, Expr: tree.NewParamExpr(yylex.(*Lexer).GetParamIndex())} } yyVAL.union = yyLOCAL - case 2015: + case 2033: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13694 +//line mysql_sql.y:13736 { yyLOCAL = &tree.FrameBound{Type: tree.Following, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 2016: + case 2034: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13700 +//line mysql_sql.y:13742 { yyLOCAL = &tree.FrameBound{Type: tree.CurrentRow} } yyVAL.union = yyLOCAL - case 2017: + case 2035: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13704 +//line mysql_sql.y:13746 { yyLOCAL = &tree.FrameBound{Type: tree.Preceding, UnBounded: true} } yyVAL.union = yyLOCAL - case 2018: + case 2036: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13708 +//line mysql_sql.y:13750 { yyLOCAL = &tree.FrameBound{Type: tree.Preceding, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 2019: + case 2037: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13712 +//line mysql_sql.y:13754 { yyLOCAL = &tree.FrameBound{Type: tree.Preceding, Expr: tree.NewParamExpr(yylex.(*Lexer).GetParamIndex())} } yyVAL.union = yyLOCAL - case 2020: + case 2038: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameBound -//line mysql_sql.y:13716 +//line mysql_sql.y:13758 { yyLOCAL = &tree.FrameBound{Type: tree.Preceding, Expr: yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 2021: + case 2039: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FrameType -//line mysql_sql.y:13722 +//line mysql_sql.y:13764 { yyLOCAL = tree.Rows } yyVAL.union = yyLOCAL - case 2022: + case 2040: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FrameType -//line mysql_sql.y:13726 +//line mysql_sql.y:13768 { yyLOCAL = tree.Range } yyVAL.union = yyLOCAL - case 2023: + case 2041: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FrameType -//line mysql_sql.y:13730 +//line mysql_sql.y:13772 { yyLOCAL = tree.Groups } yyVAL.union = yyLOCAL - case 2024: + case 2042: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FrameClause -//line mysql_sql.y:13736 +//line mysql_sql.y:13778 { yyLOCAL = &tree.FrameClause{ Type: yyDollar[1].frameTypeUnion(), @@ -33052,10 +33261,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2025: + case 2043: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FrameClause -//line mysql_sql.y:13744 +//line mysql_sql.y:13786 { yyLOCAL = &tree.FrameClause{ Type: yyDollar[1].frameTypeUnion(), @@ -33065,163 +33274,163 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2026: + case 2044: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.FrameClause -//line mysql_sql.y:13754 +//line mysql_sql.y:13796 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2027: + case 2045: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.FrameClause -//line mysql_sql.y:13758 +//line mysql_sql.y:13800 { yyLOCAL = yyDollar[1].frameClauseUnion() } yyVAL.union = yyLOCAL - case 2028: + case 2046: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:13764 +//line mysql_sql.y:13806 { yyLOCAL = yyDollar[3].exprsUnion() } yyVAL.union = yyLOCAL - case 2029: + case 2047: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:13769 +//line mysql_sql.y:13811 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2030: + case 2048: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:13773 +//line mysql_sql.y:13815 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 2031: + case 2049: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:13778 +//line mysql_sql.y:13820 { yyVAL.str = "," } - case 2032: + case 2050: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:13782 +//line mysql_sql.y:13824 { yyVAL.str = yyDollar[2].str } - case 2033: + case 2051: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:13787 +//line mysql_sql.y:13829 { yyVAL.str = "1,vector_l2_ops,random,false" } - case 2034: + case 2052: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:13791 +//line mysql_sql.y:13833 { yyVAL.str = yyDollar[2].str } - case 2035: + case 2053: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.WindowSpec -//line mysql_sql.y:13796 +//line mysql_sql.y:13838 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2037: + case 2055: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.WindowSpec -//line mysql_sql.y:13803 +//line mysql_sql.y:13845 { yyLOCAL = makeWindowSpec(yyDollar[2].cstrUnion(), nil, nil, nil) yyLOCAL.ReferencedOnly = true } yyVAL.union = yyLOCAL - case 2038: + case 2056: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.WindowSpec -//line mysql_sql.y:13808 +//line mysql_sql.y:13850 { yyLOCAL = yyDollar[3].windowSpecUnion() } yyVAL.union = yyLOCAL - case 2039: + case 2057: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.WindowSpec -//line mysql_sql.y:13814 +//line mysql_sql.y:13856 { yyLOCAL = makeWindowSpec(yyDollar[1].cstrUnion(), yyDollar[2].exprsUnion(), yyDollar[3].orderByUnion(), yyDollar[4].frameClauseUnion()) } yyVAL.union = yyLOCAL - case 2040: + case 2058: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:13823 +//line mysql_sql.y:13865 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2041: + case 2059: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.CStr -//line mysql_sql.y:13827 +//line mysql_sql.y:13869 { yyLOCAL = yyDollar[1].cstrUnion() } yyVAL.union = yyLOCAL - case 2042: + case 2060: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.WindowDefinitions -//line mysql_sql.y:13832 +//line mysql_sql.y:13874 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2043: + case 2061: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.WindowDefinitions -//line mysql_sql.y:13836 +//line mysql_sql.y:13878 { yyLOCAL = yyDollar[2].windowDefinitionsUnion() } yyVAL.union = yyLOCAL - case 2044: + case 2062: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.WindowDefinitions -//line mysql_sql.y:13842 +//line mysql_sql.y:13884 { yyLOCAL = tree.WindowDefinitions{yyDollar[1].windowDefinitionUnion()} } yyVAL.union = yyLOCAL - case 2045: + case 2063: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.WindowDefinitions -//line mysql_sql.y:13846 +//line mysql_sql.y:13888 { yyLOCAL = append(yyDollar[1].windowDefinitionsUnion(), yyDollar[3].windowDefinitionUnion()) } yyVAL.union = yyLOCAL - case 2046: + case 2064: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.WindowDefinition -//line mysql_sql.y:13852 +//line mysql_sql.y:13894 { yyLOCAL = &tree.WindowDefinition{Name: yyDollar[1].cstrUnion(), Spec: yyDollar[4].windowSpecUnion()} } yyVAL.union = yyLOCAL - case 2047: + case 2065: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13858 +//line mysql_sql.y:13900 { functionName := yyDollar[1].str arguments := yyDollar[4].exprsUnion() @@ -33264,10 +33473,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2048: + case 2066: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13900 +//line mysql_sql.y:13942 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33280,10 +33489,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2049: + case 2067: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13912 +//line mysql_sql.y:13954 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33296,10 +33505,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2050: + case 2068: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13924 +//line mysql_sql.y:13966 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33312,10 +33521,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2051: + case 2069: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13936 +//line mysql_sql.y:13978 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33327,10 +33536,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2052: + case 2070: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13947 +//line mysql_sql.y:13989 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33342,10 +33551,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2053: + case 2071: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13958 +//line mysql_sql.y:14000 { name := tree.NewUnresolvedColName(yyDollar[1].str) es := tree.NewNumVal("*", "*", false, tree.P_star) @@ -33357,10 +33566,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2054: + case 2072: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13969 +//line mysql_sql.y:14011 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33371,10 +33580,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2055: + case 2073: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13979 +//line mysql_sql.y:14021 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33387,10 +33596,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2056: + case 2074: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:13991 +//line mysql_sql.y:14033 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33402,10 +33611,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2057: + case 2075: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14002 +//line mysql_sql.y:14044 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33417,10 +33626,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2058: + case 2076: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14013 +//line mysql_sql.y:14055 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33432,10 +33641,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2059: + case 2077: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14024 +//line mysql_sql.y:14066 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33447,10 +33656,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2060: + case 2078: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14035 +//line mysql_sql.y:14077 { name := tree.NewUnresolvedColName(yyDollar[1].str) es := tree.NewNumVal("*", "*", false, tree.P_star) @@ -33462,10 +33671,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2061: + case 2079: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14046 +//line mysql_sql.y:14088 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33477,10 +33686,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2062: + case 2080: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14057 +//line mysql_sql.y:14099 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33492,10 +33701,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2063: + case 2081: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14068 +//line mysql_sql.y:14110 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33507,10 +33716,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2064: + case 2082: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14079 +//line mysql_sql.y:14121 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33522,10 +33731,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2065: + case 2083: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14090 +//line mysql_sql.y:14132 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33537,10 +33746,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2066: + case 2084: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14101 +//line mysql_sql.y:14143 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33552,10 +33761,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2067: + case 2085: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14112 +//line mysql_sql.y:14154 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33567,10 +33776,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2068: + case 2086: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14123 +//line mysql_sql.y:14165 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33582,10 +33791,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2069: + case 2087: yyDollar = yyS[yypt-9 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14134 +//line mysql_sql.y:14176 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33597,10 +33806,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2070: + case 2088: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14145 +//line mysql_sql.y:14187 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33612,10 +33821,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2071: + case 2089: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14156 +//line mysql_sql.y:14198 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33627,10 +33836,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2072: + case 2090: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14167 +//line mysql_sql.y:14209 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33642,10 +33851,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2073: + case 2091: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14178 +//line mysql_sql.y:14220 { functionName := yyDollar[1].str if strings.EqualFold(functionName, "array_agg") { @@ -33663,10 +33872,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2074: + case 2092: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14195 +//line mysql_sql.y:14237 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33678,10 +33887,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2078: + case 2096: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14213 +//line mysql_sql.y:14255 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33692,10 +33901,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2079: + case 2097: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14223 +//line mysql_sql.y:14265 { name := tree.NewUnresolvedColName(yyDollar[1].str) exprs := tree.Exprs{yyDollar[3].exprUnion()} @@ -33707,10 +33916,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2080: + case 2098: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14234 +//line mysql_sql.y:14276 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33720,10 +33929,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2081: + case 2099: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14243 +//line mysql_sql.y:14285 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33733,10 +33942,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2082: + case 2100: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14252 +//line mysql_sql.y:14294 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33746,10 +33955,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2083: + case 2101: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14261 +//line mysql_sql.y:14303 { name := tree.NewUnresolvedColName(yyDollar[1].str) str := strings.ToLower(yyDollar[3].str) @@ -33761,10 +33970,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2084: + case 2102: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14272 +//line mysql_sql.y:14314 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33774,10 +33983,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2085: + case 2103: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14281 +//line mysql_sql.y:14323 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33787,10 +33996,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2086: + case 2104: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14290 +//line mysql_sql.y:14332 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33802,10 +34011,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2087: + case 2105: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14301 +//line mysql_sql.y:14343 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33815,10 +34024,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2088: + case 2106: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14310 +//line mysql_sql.y:14352 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33828,10 +34037,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2089: + case 2107: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14319 +//line mysql_sql.y:14361 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33841,10 +34050,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2090: + case 2108: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14328 +//line mysql_sql.y:14370 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33854,10 +34063,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2091: + case 2109: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14337 +//line mysql_sql.y:14379 { name := tree.NewUnresolvedColName(yyDollar[1].str) arg0 := tree.NewNumVal(int64(0), "0", false, tree.P_int64) @@ -33870,10 +34079,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2092: + case 2110: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14349 +//line mysql_sql.y:14391 { name := tree.NewUnresolvedColName(yyDollar[1].str) arg0 := tree.NewNumVal(int64(1), "1", false, tree.P_int64) @@ -33885,10 +34094,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2093: + case 2111: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14360 +//line mysql_sql.y:14402 { name := tree.NewUnresolvedColName(yyDollar[1].str) arg0 := tree.NewNumVal(int64(2), "2", false, tree.P_int64) @@ -33902,10 +34111,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2094: + case 2112: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14373 +//line mysql_sql.y:14415 { name := tree.NewUnresolvedColName(yyDollar[1].str) arg0 := tree.NewNumVal(int64(3), "3", false, tree.P_int64) @@ -33918,10 +34127,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2095: + case 2113: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14385 +//line mysql_sql.y:14427 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -33931,16 +34140,16 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2102: + case 2120: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:14406 +//line mysql_sql.y:14448 { yyVAL.str = yyDollar[1].str } - case 2135: + case 2153: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14448 +//line mysql_sql.y:14490 { name := tree.NewUnresolvedColName(yyDollar[1].str) var es tree.Exprs = nil @@ -33954,10 +34163,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2136: + case 2154: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14461 +//line mysql_sql.y:14503 { name := tree.NewUnresolvedColName(yyDollar[1].str) var es tree.Exprs = nil @@ -33971,10 +34180,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2137: + case 2155: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14474 +//line mysql_sql.y:14516 { name := tree.NewUnresolvedColName(yyDollar[1].str) str := strings.ToLower(yyDollar[3].str) @@ -33986,10 +34195,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2138: + case 2156: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14485 +//line mysql_sql.y:14527 { name := tree.NewUnresolvedColName(yyDollar[1].str) str := strings.ToLower(yyDollar[3].str) @@ -34001,10 +34210,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2139: + case 2157: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14496 +//line mysql_sql.y:14538 { name := tree.NewUnresolvedColName(yyDollar[1].str) str := strings.ToUpper(yyDollar[3].str) @@ -34016,10 +34225,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2140: + case 2158: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14508 +//line mysql_sql.y:14550 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34029,10 +34238,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2141: + case 2159: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14517 +//line mysql_sql.y:14559 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34041,10 +34250,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2142: + case 2160: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14525 +//line mysql_sql.y:14567 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34053,10 +34262,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2143: + case 2161: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14533 +//line mysql_sql.y:14575 { name := tree.NewUnresolvedColName(yyDollar[1].str) var es tree.Exprs = nil @@ -34070,10 +34279,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2144: + case 2162: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14546 +//line mysql_sql.y:14588 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34083,10 +34292,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2145: + case 2163: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14555 +//line mysql_sql.y:14597 { name := tree.NewUnresolvedColName(yyDollar[1].str) exprs := make([]tree.Expr, 1) @@ -34098,10 +34307,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2146: + case 2164: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14566 +//line mysql_sql.y:14608 { name := tree.NewUnresolvedColName(yyDollar[1].str) exprs := make([]tree.Expr, 1) @@ -34113,10 +34322,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2147: + case 2165: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14577 +//line mysql_sql.y:14619 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34126,10 +34335,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2148: + case 2166: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14586 +//line mysql_sql.y:14628 { charName := tree.NewUnresolvedColName(yyDollar[1].str) charExpr := &tree.FuncExpr{ @@ -34146,10 +34355,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2149: + case 2167: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14602 +//line mysql_sql.y:14644 { val := tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_char) name := tree.NewUnresolvedColName(yyDollar[1].str) @@ -34160,10 +34369,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2150: + case 2168: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14612 +//line mysql_sql.y:14654 { val := tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_char) name := tree.NewUnresolvedColName(yyDollar[1].str) @@ -34174,10 +34383,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2151: + case 2169: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14622 +//line mysql_sql.y:14664 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34187,10 +34396,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2152: + case 2170: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14631 +//line mysql_sql.y:14673 { es := tree.Exprs{yyDollar[3].exprUnion()} es = append(es, yyDollar[5].exprUnion()) @@ -34202,10 +34411,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2153: + case 2171: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14642 +//line mysql_sql.y:14684 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34215,10 +34424,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2154: + case 2172: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14651 +//line mysql_sql.y:14693 { val := tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_char) name := tree.NewUnresolvedColName(yyDollar[1].str) @@ -34229,10 +34438,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2155: + case 2173: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14661 +//line mysql_sql.y:14703 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34242,10 +34451,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2156: + case 2174: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14670 +//line mysql_sql.y:14712 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34255,10 +34464,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2157: + case 2175: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.FuncExpr -//line mysql_sql.y:14679 +//line mysql_sql.y:14721 { name := tree.NewUnresolvedColName(yyDollar[1].str) yyLOCAL = &tree.FuncExpr{ @@ -34268,34 +34477,34 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2158: + case 2176: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14689 +//line mysql_sql.y:14731 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2159: + case 2177: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14693 +//line mysql_sql.y:14735 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 2160: + case 2178: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14699 +//line mysql_sql.y:14741 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2161: + case 2179: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14703 +//line mysql_sql.y:14745 { ival, errStr := util.GetInt64(yyDollar[2].item) if errStr != "" { @@ -34306,20 +34515,20 @@ yydefault: yyLOCAL = tree.NewNumVal(ival, str, false, tree.P_int64) } yyVAL.union = yyLOCAL - case 2168: + case 2186: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:14722 +//line mysql_sql.y:14764 { } - case 2169: + case 2187: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:14724 +//line mysql_sql.y:14766 { } - case 2206: + case 2224: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14768 +//line mysql_sql.y:14810 { name := tree.NewUnresolvedColName(yyDollar[1].str) str := strings.ToLower(yyDollar[3].str) @@ -34331,531 +34540,531 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2207: + case 2225: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.FuncType -//line mysql_sql.y:14780 +//line mysql_sql.y:14822 { yyLOCAL = tree.FUNC_TYPE_DEFAULT } yyVAL.union = yyLOCAL - case 2208: + case 2226: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FuncType -//line mysql_sql.y:14784 +//line mysql_sql.y:14826 { yyLOCAL = tree.FUNC_TYPE_DISTINCT } yyVAL.union = yyLOCAL - case 2209: + case 2227: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.FuncType -//line mysql_sql.y:14788 +//line mysql_sql.y:14830 { yyLOCAL = tree.FUNC_TYPE_ALL } yyVAL.union = yyLOCAL - case 2210: + case 2228: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.Tuple -//line mysql_sql.y:14794 +//line mysql_sql.y:14836 { yyLOCAL = tree.NewTuple(yyDollar[2].exprsUnion()) } yyVAL.union = yyLOCAL - case 2211: + case 2229: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:14799 +//line mysql_sql.y:14841 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2212: + case 2230: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:14803 +//line mysql_sql.y:14845 { yyLOCAL = yyDollar[1].exprsUnion() } yyVAL.union = yyLOCAL - case 2213: + case 2231: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:14809 +//line mysql_sql.y:14851 { yyLOCAL = tree.Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 2214: + case 2232: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:14813 +//line mysql_sql.y:14855 { yyLOCAL = append(yyDollar[1].exprsUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2215: + case 2233: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:14819 +//line mysql_sql.y:14861 { yyLOCAL = tree.Exprs{yyDollar[1].exprUnion()} } yyVAL.union = yyLOCAL - case 2216: + case 2234: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Exprs -//line mysql_sql.y:14823 +//line mysql_sql.y:14865 { yyLOCAL = append(yyDollar[1].exprsUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2217: + case 2235: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14830 +//line mysql_sql.y:14872 { yyLOCAL = tree.NewAndExpr(yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2218: + case 2236: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14834 +//line mysql_sql.y:14876 { yyLOCAL = tree.NewOrExpr(yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2219: + case 2237: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14838 +//line mysql_sql.y:14880 { yyLOCAL = tree.NewXorExpr(yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2220: + case 2238: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14842 +//line mysql_sql.y:14884 { yyLOCAL = tree.NewNotExpr(yyDollar[2].exprUnion()) } yyVAL.union = yyLOCAL - case 2221: + case 2239: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14846 +//line mysql_sql.y:14888 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 2222: + case 2240: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14851 +//line mysql_sql.y:14893 { yyLOCAL = yyDollar[1].exprUnion() } yyVAL.union = yyLOCAL - case 2223: + case 2241: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14855 +//line mysql_sql.y:14897 { yyLOCAL = tree.NewMaxValue() } yyVAL.union = yyLOCAL - case 2224: + case 2242: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14861 +//line mysql_sql.y:14903 { yyLOCAL = tree.NewIsNullExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2225: + case 2243: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14865 +//line mysql_sql.y:14907 { yyLOCAL = tree.NewIsNotNullExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2226: + case 2244: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14869 +//line mysql_sql.y:14911 { yyLOCAL = tree.NewIsNotNullExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2227: + case 2245: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14873 +//line mysql_sql.y:14915 { yyLOCAL = tree.NewIsUnknownExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2228: + case 2246: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14877 +//line mysql_sql.y:14919 { yyLOCAL = tree.NewIsNotUnknownExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2229: + case 2247: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14881 +//line mysql_sql.y:14923 { yyLOCAL = tree.NewIsNotUnknownExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2230: + case 2248: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14885 +//line mysql_sql.y:14927 { yyLOCAL = tree.NewIsTrueExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2231: + case 2249: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14889 +//line mysql_sql.y:14931 { yyLOCAL = tree.NewIsNotTrueExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2232: + case 2250: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14893 +//line mysql_sql.y:14935 { yyLOCAL = tree.NewIsNotTrueExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2233: + case 2251: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14897 +//line mysql_sql.y:14939 { yyLOCAL = tree.NewIsFalseExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2234: + case 2252: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14901 +//line mysql_sql.y:14943 { yyLOCAL = tree.NewIsNotFalseExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2235: + case 2253: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14905 +//line mysql_sql.y:14947 { yyLOCAL = tree.NewIsNotFalseExpr(yyDollar[1].exprUnion()) } yyVAL.union = yyLOCAL - case 2236: + case 2254: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14909 +//line mysql_sql.y:14951 { yyLOCAL = tree.NewComparisonExpr(yyDollar[2].comparisonOpUnion(), yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2237: + case 2255: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14913 +//line mysql_sql.y:14955 { yyLOCAL = tree.NewSubqueryComparisonExpr(yyDollar[2].comparisonOpUnion(), yyDollar[3].comparisonOpUnion(), yyDollar[1].exprUnion(), yyDollar[4].subqueryUnion()) yyLOCAL = tree.NewSubqueryComparisonExpr(yyDollar[2].comparisonOpUnion(), yyDollar[3].comparisonOpUnion(), yyDollar[1].exprUnion(), yyDollar[4].subqueryUnion()) } yyVAL.union = yyLOCAL - case 2239: + case 2257: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14921 +//line mysql_sql.y:14963 { yyLOCAL = tree.NewComparisonExpr(tree.IN, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2240: + case 2258: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14925 +//line mysql_sql.y:14967 { yyLOCAL = tree.NewComparisonExpr(tree.NOT_IN, yyDollar[1].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 2241: + case 2259: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14929 +//line mysql_sql.y:14971 { yyLOCAL = tree.NewComparisonExpr(tree.NOT_IN, yyDollar[1].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 2242: + case 2260: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14933 +//line mysql_sql.y:14975 { yyLOCAL = tree.NewComparisonExpr(tree.MEMBER_OF, yyDollar[1].exprUnion(), yyDollar[5].exprUnion()) } yyVAL.union = yyLOCAL - case 2243: + case 2261: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14937 +//line mysql_sql.y:14979 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.LIKE, yyDollar[1].exprUnion(), yyDollar[3].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 2244: + case 2262: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14941 +//line mysql_sql.y:14983 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.NOT_LIKE, yyDollar[1].exprUnion(), yyDollar[4].exprUnion(), yyDollar[5].exprUnion()) } yyVAL.union = yyLOCAL - case 2245: + case 2263: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14945 +//line mysql_sql.y:14987 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.NOT_LIKE, yyDollar[1].exprUnion(), yyDollar[4].exprUnion(), yyDollar[5].exprUnion()) } yyVAL.union = yyLOCAL - case 2246: + case 2264: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14949 +//line mysql_sql.y:14991 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.ILIKE, yyDollar[1].exprUnion(), yyDollar[3].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 2247: + case 2265: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14953 +//line mysql_sql.y:14995 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.NOT_ILIKE, yyDollar[1].exprUnion(), yyDollar[4].exprUnion(), yyDollar[5].exprUnion()) } yyVAL.union = yyLOCAL - case 2248: + case 2266: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14957 +//line mysql_sql.y:14999 { yyLOCAL = tree.NewComparisonExprWithEscape(tree.NOT_ILIKE, yyDollar[1].exprUnion(), yyDollar[4].exprUnion(), yyDollar[5].exprUnion()) } yyVAL.union = yyLOCAL - case 2249: + case 2267: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14961 +//line mysql_sql.y:15003 { yyLOCAL = tree.NewComparisonExpr(tree.REG_MATCH, yyDollar[1].exprUnion(), yyDollar[3].exprUnion()) } yyVAL.union = yyLOCAL - case 2250: + case 2268: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14965 +//line mysql_sql.y:15007 { yyLOCAL = tree.NewComparisonExpr(tree.NOT_REG_MATCH, yyDollar[1].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 2251: + case 2269: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14969 +//line mysql_sql.y:15011 { yyLOCAL = tree.NewComparisonExpr(tree.NOT_REG_MATCH, yyDollar[1].exprUnion(), yyDollar[4].exprUnion()) } yyVAL.union = yyLOCAL - case 2252: + case 2270: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14973 +//line mysql_sql.y:15015 { yyLOCAL = tree.NewRangeCond(false, yyDollar[1].exprUnion(), yyDollar[3].exprUnion(), yyDollar[5].exprUnion()) } yyVAL.union = yyLOCAL - case 2253: + case 2271: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14977 +//line mysql_sql.y:15019 { yyLOCAL = tree.NewRangeCond(true, yyDollar[1].exprUnion(), yyDollar[4].exprUnion(), yyDollar[6].exprUnion()) } yyVAL.union = yyLOCAL - case 2254: + case 2272: yyDollar = yyS[yypt-6 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14981 +//line mysql_sql.y:15023 { yyLOCAL = tree.NewRangeCond(true, yyDollar[1].exprUnion(), yyDollar[4].exprUnion(), yyDollar[6].exprUnion()) } yyVAL.union = yyLOCAL - case 2256: + case 2274: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14987 +//line mysql_sql.y:15029 { yyLOCAL = nil } yyVAL.union = yyLOCAL - case 2257: + case 2275: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:14991 +//line mysql_sql.y:15033 { yyLOCAL = yyDollar[2].exprUnion() } yyVAL.union = yyLOCAL - case 2260: + case 2278: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15001 +//line mysql_sql.y:15043 { yyLOCAL = yyDollar[1].tupleUnion() } yyVAL.union = yyLOCAL - case 2261: + case 2279: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15005 +//line mysql_sql.y:15047 { yyLOCAL = yyDollar[1].subqueryUnion() } yyVAL.union = yyLOCAL - case 2262: + case 2280: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15012 +//line mysql_sql.y:15054 { yyLOCAL = tree.ALL } yyVAL.union = yyLOCAL - case 2263: + case 2281: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15016 +//line mysql_sql.y:15058 { yyLOCAL = tree.ANY } yyVAL.union = yyLOCAL - case 2264: + case 2282: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15020 +//line mysql_sql.y:15062 { yyLOCAL = tree.SOME } yyVAL.union = yyLOCAL - case 2265: + case 2283: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15026 +//line mysql_sql.y:15068 { yyLOCAL = tree.EQUAL } yyVAL.union = yyLOCAL - case 2266: + case 2284: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15030 +//line mysql_sql.y:15072 { yyLOCAL = tree.LESS_THAN } yyVAL.union = yyLOCAL - case 2267: + case 2285: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15034 +//line mysql_sql.y:15076 { yyLOCAL = tree.GREAT_THAN } yyVAL.union = yyLOCAL - case 2268: + case 2286: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15038 +//line mysql_sql.y:15080 { yyLOCAL = tree.LESS_THAN_EQUAL } yyVAL.union = yyLOCAL - case 2269: + case 2287: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15042 +//line mysql_sql.y:15084 { yyLOCAL = tree.GREAT_THAN_EQUAL } yyVAL.union = yyLOCAL - case 2270: + case 2288: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15046 +//line mysql_sql.y:15088 { yyLOCAL = tree.NOT_EQUAL } yyVAL.union = yyLOCAL - case 2271: + case 2289: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ComparisonOp -//line mysql_sql.y:15050 +//line mysql_sql.y:15092 { yyLOCAL = tree.NULL_SAFE_EQUAL } yyVAL.union = yyLOCAL - case 2272: + case 2290: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:15056 +//line mysql_sql.y:15098 { yyLOCAL = tree.NewAttributePrimaryKey() } yyVAL.union = yyLOCAL - case 2273: + case 2291: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:15060 +//line mysql_sql.y:15102 { yyLOCAL = tree.NewAttributeUniqueKey() } yyVAL.union = yyLOCAL - case 2274: + case 2292: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:15064 +//line mysql_sql.y:15106 { yyLOCAL = tree.NewAttributeUnique() } yyVAL.union = yyLOCAL - case 2275: + case 2293: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.ColumnAttribute -//line mysql_sql.y:15068 +//line mysql_sql.y:15110 { yyLOCAL = tree.NewAttributeKey() } yyVAL.union = yyLOCAL - case 2276: + case 2294: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15074 +//line mysql_sql.y:15116 { str := fmt.Sprintf("%v", yyDollar[1].item) switch v := yyDollar[1].item.(type) { @@ -34869,35 +35078,35 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2277: + case 2295: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15087 +//line mysql_sql.y:15129 { fval := yyDollar[1].item.(float64) yyLOCAL = tree.NewNumVal(fval, yylex.(*Lexer).scanner.LastToken, false, tree.P_float64) } yyVAL.union = yyLOCAL - case 2278: + case 2296: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15092 +//line mysql_sql.y:15134 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_decimal) } yyVAL.union = yyLOCAL - case 2279: + case 2297: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15098 +//line mysql_sql.y:15140 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_char) } yyVAL.union = yyLOCAL - case 2280: + case 2298: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15102 +//line mysql_sql.y:15144 { str := fmt.Sprintf("%v", yyDollar[1].item) switch v := yyDollar[1].item.(type) { @@ -34911,101 +35120,101 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2281: + case 2299: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15115 +//line mysql_sql.y:15157 { fval := yyDollar[1].item.(float64) yyLOCAL = tree.NewNumVal(fval, yylex.(*Lexer).scanner.LastToken, false, tree.P_float64) } yyVAL.union = yyLOCAL - case 2282: + case 2300: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15120 +//line mysql_sql.y:15162 { yyLOCAL = tree.NewNumVal(true, "true", false, tree.P_bool) } yyVAL.union = yyLOCAL - case 2283: + case 2301: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15124 +//line mysql_sql.y:15166 { yyLOCAL = tree.NewNumVal(false, "false", false, tree.P_bool) } yyVAL.union = yyLOCAL - case 2284: + case 2302: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15128 +//line mysql_sql.y:15170 { yyLOCAL = tree.NewNumVal("null", "null", false, tree.P_null) } yyVAL.union = yyLOCAL - case 2285: + case 2303: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15132 +//line mysql_sql.y:15174 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_hexnum) } yyVAL.union = yyLOCAL - case 2286: + case 2304: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15136 +//line mysql_sql.y:15178 { yyLOCAL = tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_ScoreBinaryHexnum) } yyVAL.union = yyLOCAL - case 2287: + case 2305: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15140 +//line mysql_sql.y:15182 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_decimal) } yyVAL.union = yyLOCAL - case 2288: + case 2306: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15144 +//line mysql_sql.y:15186 { yyLOCAL = tree.NewNumVal(yyDollar[1].str, yyDollar[1].str, false, tree.P_bit) } yyVAL.union = yyLOCAL - case 2289: + case 2307: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15148 +//line mysql_sql.y:15190 { yyLOCAL = tree.NewParamExpr(yylex.(*Lexer).GetParamIndex()) } yyVAL.union = yyLOCAL - case 2290: + case 2308: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Expr -//line mysql_sql.y:15152 +//line mysql_sql.y:15194 { yyLOCAL = tree.NewNumVal(yyDollar[2].str, yyDollar[2].str, false, tree.P_ScoreBinary) } yyVAL.union = yyLOCAL - case 2291: + case 2309: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15158 +//line mysql_sql.y:15200 { yyLOCAL = yyDollar[1].columnTypeUnion() yyLOCAL.InternalType.Unsigned = yyDollar[2].unsignedOptUnion() yyLOCAL.InternalType.Zerofill = yyDollar[3].zeroFillOptUnion() } yyVAL.union = yyLOCAL - case 2295: + case 2313: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15167 +//line mysql_sql.y:15209 { locale := "" yyLOCAL = &tree.T{ @@ -35019,27 +35228,27 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2296: + case 2314: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15182 +//line mysql_sql.y:15224 { yyLOCAL = yyDollar[1].columnTypeUnion() yyLOCAL.InternalType.DisplayWith = yyDollar[2].lengthOptUnion() } yyVAL.union = yyLOCAL - case 2297: + case 2315: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15187 +//line mysql_sql.y:15229 { yyLOCAL = yyDollar[1].columnTypeUnion() } yyVAL.union = yyLOCAL - case 2298: + case 2316: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15193 +//line mysql_sql.y:15235 { locale := "" yyLOCAL = &tree.T{ @@ -35052,10 +35261,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2299: + case 2317: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15205 +//line mysql_sql.y:15247 { locale := "" yyLOCAL = &tree.T{ @@ -35068,10 +35277,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2300: + case 2318: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15217 +//line mysql_sql.y:15259 { locale := "" yyLOCAL = &tree.T{ @@ -35084,10 +35293,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2301: + case 2319: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15229 +//line mysql_sql.y:15271 { locale := "" yyLOCAL = &tree.T{ @@ -35101,10 +35310,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2302: + case 2320: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15242 +//line mysql_sql.y:15284 { locale := "" yyLOCAL = &tree.T{ @@ -35118,10 +35327,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2303: + case 2321: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15255 +//line mysql_sql.y:15297 { locale := "" yyLOCAL = &tree.T{ @@ -35135,10 +35344,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2304: + case 2322: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15268 +//line mysql_sql.y:15310 { locale := "" yyLOCAL = &tree.T{ @@ -35152,10 +35361,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2305: + case 2323: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15281 +//line mysql_sql.y:15323 { locale := "" yyLOCAL = &tree.T{ @@ -35169,10 +35378,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2306: + case 2324: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15294 +//line mysql_sql.y:15336 { locale := "" yyLOCAL = &tree.T{ @@ -35186,10 +35395,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2307: + case 2325: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15307 +//line mysql_sql.y:15349 { locale := "" yyLOCAL = &tree.T{ @@ -35203,10 +35412,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2308: + case 2326: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15320 +//line mysql_sql.y:15362 { locale := "" yyLOCAL = &tree.T{ @@ -35220,10 +35429,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2309: + case 2327: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15333 +//line mysql_sql.y:15375 { locale := "" yyLOCAL = &tree.T{ @@ -35237,10 +35446,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2310: + case 2328: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15346 +//line mysql_sql.y:15388 { locale := "" yyLOCAL = &tree.T{ @@ -35254,10 +35463,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2311: + case 2329: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15359 +//line mysql_sql.y:15401 { locale := "" yyLOCAL = &tree.T{ @@ -35271,10 +35480,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2312: + case 2330: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15374 +//line mysql_sql.y:15416 { locale := "" if yyDollar[2].lengthScaleOptUnion().DisplayWith > 255 { @@ -35302,10 +35511,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2313: + case 2331: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15401 +//line mysql_sql.y:15443 { // DOUBLE PRECISION is the SQL-standard synonym for DOUBLE (float64). locale := "" @@ -35334,10 +35543,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2314: + case 2332: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15429 +//line mysql_sql.y:15471 { locale := "" if yyDollar[2].lengthScaleOptUnion().DisplayWith > 255 { @@ -35379,10 +35588,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2315: + case 2333: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15471 +//line mysql_sql.y:15513 { locale := "" if yyDollar[2].lengthScaleOptUnion().Scale != tree.NotDefineDec && yyDollar[2].lengthScaleOptUnion().Scale > yyDollar[2].lengthScaleOptUnion().DisplayWith { @@ -35431,10 +35640,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2316: + case 2334: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15519 +//line mysql_sql.y:15561 { locale := "" if yyDollar[2].lengthScaleOptUnion().Scale != tree.NotDefineDec && yyDollar[2].lengthScaleOptUnion().Scale > yyDollar[2].lengthScaleOptUnion().DisplayWith { @@ -35483,10 +35692,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2317: + case 2335: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15567 +//line mysql_sql.y:15609 { locale := "" width := int32(64) @@ -35508,10 +35717,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2318: + case 2336: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15590 +//line mysql_sql.y:15632 { locale := "" yyLOCAL = &tree.T{ @@ -35524,10 +35733,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2319: + case 2337: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15602 +//line mysql_sql.y:15644 { locale := "" if yyDollar[2].lengthOptUnion() < 0 || yyDollar[2].lengthOptUnion() > 6 { @@ -35548,10 +35757,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2320: + case 2338: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15622 +//line mysql_sql.y:15664 { locale := "" if yyDollar[2].lengthOptUnion() < 0 || yyDollar[2].lengthOptUnion() > 6 { @@ -35572,10 +35781,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2321: + case 2339: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15642 +//line mysql_sql.y:15684 { locale := "" if yyDollar[2].lengthOptUnion() < 0 || yyDollar[2].lengthOptUnion() > 6 { @@ -35596,10 +35805,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2322: + case 2340: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15662 +//line mysql_sql.y:15704 { locale := "" yyLOCAL = &tree.T{ @@ -35614,10 +35823,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2323: + case 2341: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15678 +//line mysql_sql.y:15720 { locale := "" yyLOCAL = &tree.T{ @@ -35631,10 +35840,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2324: + case 2342: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15691 +//line mysql_sql.y:15733 { locale := "" yyLOCAL = &tree.T{ @@ -35648,10 +35857,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2325: + case 2343: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15704 +//line mysql_sql.y:15746 { locale := "" yyLOCAL = &tree.T{ @@ -35665,10 +35874,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2326: + case 2344: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15717 +//line mysql_sql.y:15759 { locale := "" yyLOCAL = &tree.T{ @@ -35682,10 +35891,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2327: + case 2345: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15730 +//line mysql_sql.y:15772 { locale := "" yyLOCAL = &tree.T{ @@ -35698,10 +35907,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2328: + case 2346: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15742 +//line mysql_sql.y:15784 { locale := "" yyLOCAL = &tree.T{ @@ -35714,10 +35923,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2329: + case 2347: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15754 +//line mysql_sql.y:15796 { locale := "" yyLOCAL = &tree.T{ @@ -35730,10 +35939,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2330: + case 2348: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15766 +//line mysql_sql.y:15808 { locale := "" yyLOCAL = &tree.T{ @@ -35747,10 +35956,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2331: + case 2349: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15779 +//line mysql_sql.y:15821 { locale := "" yyLOCAL = &tree.T{ @@ -35763,10 +35972,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2332: + case 2350: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15791 +//line mysql_sql.y:15833 { locale := "" yyLOCAL = &tree.T{ @@ -35779,10 +35988,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2333: + case 2351: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15803 +//line mysql_sql.y:15845 { locale := "" yyLOCAL = &tree.T{ @@ -35795,10 +36004,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2334: + case 2352: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15815 +//line mysql_sql.y:15857 { locale := "" yyLOCAL = &tree.T{ @@ -35812,10 +36021,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2335: + case 2353: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15828 +//line mysql_sql.y:15870 { locale := "" yyLOCAL = &tree.T{ @@ -35828,10 +36037,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2336: + case 2354: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15840 +//line mysql_sql.y:15882 { locale := "" yyLOCAL = &tree.T{ @@ -35844,10 +36053,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2337: + case 2355: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15852 +//line mysql_sql.y:15894 { locale := "" yyLOCAL = &tree.T{ @@ -35860,10 +36069,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2338: + case 2356: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15864 +//line mysql_sql.y:15906 { locale := "" yyLOCAL = &tree.T{ @@ -35876,10 +36085,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2339: + case 2357: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15876 +//line mysql_sql.y:15918 { locale := "" yyLOCAL = &tree.T{ @@ -35893,10 +36102,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2340: + case 2358: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15889 +//line mysql_sql.y:15931 { locale := "" yyLOCAL = &tree.T{ @@ -35910,10 +36119,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2341: + case 2359: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15902 +//line mysql_sql.y:15944 { locale := "" yyLOCAL = &tree.T{ @@ -35927,10 +36136,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2342: + case 2360: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15915 +//line mysql_sql.y:15957 { locale := "" yyLOCAL = &tree.T{ @@ -35944,10 +36153,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2343: + case 2361: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15928 +//line mysql_sql.y:15970 { locale := "" yyLOCAL = &tree.T{ @@ -35961,10 +36170,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2344: + case 2362: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15941 +//line mysql_sql.y:15983 { locale := "" yyLOCAL = &tree.T{ @@ -35978,10 +36187,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2345: + case 2363: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15954 +//line mysql_sql.y:15996 { locale := "" yyLOCAL = &tree.T{ @@ -35995,10 +36204,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2346: + case 2364: yyDollar = yyS[yypt-4 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15967 +//line mysql_sql.y:16009 { locale := "" yyLOCAL = &tree.T{ @@ -36012,10 +36221,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2347: + case 2365: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:15980 +//line mysql_sql.y:16022 { locale := "" yyLOCAL = &tree.T{ @@ -36029,20 +36238,20 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2348: + case 2366: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:15995 +//line mysql_sql.y:16037 { yyLOCAL = &tree.Do{ Exprs: yyDollar[2].exprsUnion(), } } yyVAL.union = yyLOCAL - case 2349: + case 2367: yyDollar = yyS[yypt-2 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:16003 +//line mysql_sql.y:16045 { yyDollar[2].selectUnion().IsPerform = true if intoErr := tree.ValidatePerformSelectIntoPlacement(yyDollar[2].selectUnion()); intoErr != "" { @@ -36052,10 +36261,10 @@ yydefault: yyLOCAL = yyDollar[2].selectUnion() } yyVAL.union = yyLOCAL - case 2350: + case 2368: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:16014 +//line mysql_sql.y:16056 { yyLOCAL = &tree.Select{Select: yyDollar[1].selectStatementUnion(), TimeWindow: yyDollar[2].timeWindowUnion(), OrderBy: yyDollar[3].orderByUnion(), Limit: yyDollar[4].limitUnion(), RankOption: yyDollar[5].rankOptionUnion(), Ep: tree.SelectIntoExportOr(yyDollar[1].selectStatementUnion(), yyDollar[6].selectIntoUnion().Export), IntoVars: yyDollar[6].selectIntoUnion().UserVars, SelectLockInfo: yyDollar[7].selectLockInfoUnion()} if intoErr := tree.ValidatePerformSelectIntoPlacement(yyLOCAL); intoErr != "" { @@ -36064,10 +36273,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2351: + case 2369: yyDollar = yyS[yypt-8 : yypt+1] var yyLOCAL *tree.Select -//line mysql_sql.y:16022 +//line mysql_sql.y:16064 { yyLOCAL = &tree.Select{Select: yyDollar[2].selectStatementUnion(), TimeWindow: yyDollar[3].timeWindowUnion(), OrderBy: yyDollar[4].orderByUnion(), Limit: yyDollar[5].limitUnion(), RankOption: yyDollar[6].rankOptionUnion(), Ep: tree.SelectIntoExportOr(yyDollar[2].selectStatementUnion(), yyDollar[7].selectIntoUnion().Export), IntoVars: yyDollar[7].selectIntoUnion().UserVars, SelectLockInfo: yyDollar[8].selectLockInfoUnion(), With: yyDollar[1].withClauseUnion()} if intoErr := tree.ValidatePerformSelectIntoPlacement(yyLOCAL); intoErr != "" { @@ -36076,10 +36285,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2352: + case 2370: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:16032 +//line mysql_sql.y:16074 { yyLOCAL = &tree.Declare{ Variables: yyDollar[2].strsUnion(), @@ -36088,10 +36297,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2353: + case 2371: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.Statement -//line mysql_sql.y:16041 +//line mysql_sql.y:16083 { yyLOCAL = &tree.Declare{ Variables: yyDollar[2].strsUnion(), @@ -36100,51 +36309,51 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2354: + case 2372: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL *tree.T -//line mysql_sql.y:16051 +//line mysql_sql.y:16093 { yyLOCAL = tree.NewSpatialType(yyDollar[1].str) } yyVAL.union = yyLOCAL - case 2373: + case 2391: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:16079 +//line mysql_sql.y:16121 { yyLOCAL = make([]string, 0, 4) yyLOCAL = append(yyLOCAL, yyDollar[1].str) } yyVAL.union = yyLOCAL - case 2374: + case 2392: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL []string -//line mysql_sql.y:16084 +//line mysql_sql.y:16126 { yyLOCAL = append(yyDollar[1].strsUnion(), yyDollar[3].str) } yyVAL.union = yyLOCAL - case 2375: + case 2393: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:16090 +//line mysql_sql.y:16132 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 2377: + case 2395: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:16097 +//line mysql_sql.y:16139 { yyLOCAL = 0 } yyVAL.union = yyLOCAL - case 2378: + case 2396: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:16101 +//line mysql_sql.y:16143 { value, ok := typeLengthIntegral(yylex, yyDollar[2].item) if !ok { @@ -36153,18 +36362,18 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 2379: + case 2397: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:16108 +//line mysql_sql.y:16150 { yyLOCAL = int32(-1) } yyVAL.union = yyLOCAL - case 2380: + case 2398: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:16112 +//line mysql_sql.y:16154 { value, ok := typeLengthIntegral(yylex, yyDollar[2].item) if !ok { @@ -36173,10 +36382,10 @@ yydefault: yyLOCAL = value } yyVAL.union = yyLOCAL - case 2381: + case 2399: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL int32 -//line mysql_sql.y:16120 +//line mysql_sql.y:16162 { value, ok := typeLengthIntegral(yylex, yyDollar[2].item) if !ok { @@ -36185,10 +36394,10 @@ yydefault: yyLOCAL = tree.GetDisplayWith(value) } yyVAL.union = yyLOCAL - case 2382: + case 2400: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:16128 +//line mysql_sql.y:16170 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: tree.NotDefineDisplayWidth, @@ -36196,10 +36405,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2383: + case 2401: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:16135 +//line mysql_sql.y:16177 { value, ok := typeLengthIntegral(yylex, yyDollar[2].item) if !ok { @@ -36211,10 +36420,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2384: + case 2402: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:16144 +//line mysql_sql.y:16186 { width, ok := typeLengthIntegral(yylex, yyDollar[2].item) if !ok { @@ -36230,10 +36439,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2385: + case 2403: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:16157 +//line mysql_sql.y:16199 { yyLOCAL = tree.LengthScaleOpt{ DisplayWith: 10, // MySQL default precision for DECIMAL/NUMERIC @@ -36241,10 +36450,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2386: + case 2404: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:16164 +//line mysql_sql.y:16206 { value, ok := typeLengthIntegral(yylex, yyDollar[2].item) if !ok { @@ -36256,10 +36465,10 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2387: + case 2405: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.LengthScaleOpt -//line mysql_sql.y:16173 +//line mysql_sql.y:16215 { width, ok := typeLengthIntegral(yylex, yyDollar[2].item) if !ok { @@ -36275,104 +36484,104 @@ yydefault: } } yyVAL.union = yyLOCAL - case 2388: + case 2406: yyDollar = yyS[yypt-0 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:16186 +//line mysql_sql.y:16228 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 2389: + case 2407: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:16190 +//line mysql_sql.y:16232 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 2390: + case 2408: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:16194 +//line mysql_sql.y:16236 { yyLOCAL = false } yyVAL.union = yyLOCAL - case 2391: + case 2409: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:16200 +//line mysql_sql.y:16242 { } - case 2392: + case 2410: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL bool -//line mysql_sql.y:16202 +//line mysql_sql.y:16244 { yyLOCAL = true } yyVAL.union = yyLOCAL - case 2396: + case 2414: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:16212 +//line mysql_sql.y:16254 { yyVAL.str = "" } - case 2397: + case 2415: yyDollar = yyS[yypt-1 : yypt+1] -//line mysql_sql.y:16216 +//line mysql_sql.y:16258 { yyVAL.str = string(yyDollar[1].str) } - case 2913: + case 2937: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:16935 +//line mysql_sql.y:16983 { } - case 2914: + case 2938: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:16938 +//line mysql_sql.y:16986 { } - case 2915: + case 2939: yyDollar = yyS[yypt-0 : yypt+1] -//line mysql_sql.y:16942 +//line mysql_sql.y:16990 { } - case 2916: + case 2940: yyDollar = yyS[yypt-2 : yypt+1] -//line mysql_sql.y:16945 +//line mysql_sql.y:16993 { } - case 2917: + case 2941: yyDollar = yyS[yypt-5 : yypt+1] var yyLOCAL tree.AlterTableOptions -//line mysql_sql.y:16955 +//line mysql_sql.y:17003 { yyLOCAL = yyDollar[4].alterTableOptionsUnion() } yyVAL.union = yyLOCAL - case 2918: + case 2942: yyDollar = yyS[yypt-7 : yypt+1] var yyLOCAL tree.AlterTableOptions -//line mysql_sql.y:16959 +//line mysql_sql.y:17007 { yyLOCAL = append(yyDollar[1].alterTableOptionsUnion(), yyDollar[6].alterTableOptionsUnion()...) } yyVAL.union = yyLOCAL - case 2919: + case 2943: yyDollar = yyS[yypt-1 : yypt+1] var yyLOCAL tree.AlterTableOptions -//line mysql_sql.y:16965 +//line mysql_sql.y:17013 { position := tree.NewColumnPosition(tree.ColumnPositionNone, nil) yyLOCAL = tree.AlterTableOptions{tree.NewAlterAddCol(yyDollar[1].columnTableDefUnion(), position)} } yyVAL.union = yyLOCAL - case 2920: + case 2944: yyDollar = yyS[yypt-3 : yypt+1] var yyLOCAL tree.AlterTableOptions -//line mysql_sql.y:16970 +//line mysql_sql.y:17018 { position := tree.NewColumnPosition(tree.ColumnPositionNone, nil) yyLOCAL = append(yyDollar[1].alterTableOptionsUnion(), tree.NewAlterAddCol(yyDollar[3].columnTableDefUnion(), position)) diff --git a/pkg/sql/parsers/dialect/mysql/mysql_sql.y b/pkg/sql/parsers/dialect/mysql/mysql_sql.y index 195428585e628..d3bc5f9276383 100644 --- a/pkg/sql/parsers/dialect/mysql/mysql_sql.y +++ b/pkg/sql/parsers/dialect/mysql/mysql_sql.y @@ -755,6 +755,9 @@ func makeWindowSpec(refName *tree.CStr, partitionBy tree.Exprs, orderBy tree.Ord %type create_account_stmt create_user_stmt create_role_stmt %type create_ddl_stmt create_table_stmt create_database_stmt create_index_stmt create_view_stmt create_function_stmt create_extension_stmt create_procedure_stmt create_sequence_stmt create_iceberg_catalog_stmt create_mongodb_connection_stmt %type pause_daemon_task_stmt cancel_daemon_task_stmt resume_daemon_task_stmt create_sql_task_stmt drop_sql_task_stmt alter_sql_task_stmt show_sql_tasks_stmt show_sql_task_runs_stmt +%type create_materialized_view_stmt refresh_materialized_view_stmt drop_materialized_view_stmt alter_materialized_view_stmt show_materialized_views_stmt +%type mv_refresh_policy mv_interval_unit +%token MATERIALIZED REFRESH MANUAL EVERY VIEWS REFRESHES %type show_stmt show_create_stmt show_columns_stmt show_databases_stmt show_target_filter_stmt show_table_status_stmt show_grants_stmt show_collation_stmt show_accounts_stmt show_roles_stmt show_stages_stmt show_snapshots_stmt show_upgrade_stmt show_rules_on_role_stmt show_iceberg_stmt show_mongodb_connections_stmt %type show_tables_stmt show_sequences_stmt show_process_stmt show_errors_stmt show_warnings_stmt show_target %type show_procedure_status_stmt show_function_status_stmt show_node_list_stmt show_locks_stmt @@ -1260,6 +1263,8 @@ normal_stmt: | reset_stmt | execute_stmt | show_stmt +| show_materialized_views_stmt +| refresh_materialized_view_stmt | alter_stmt | analyze_stmt | check_table_stmt @@ -4103,6 +4108,7 @@ alter_stmt: | alter_pitr_stmt | alter_role_stmt | alter_sql_task_stmt +| alter_materialized_view_stmt | alter_iceberg_catalog_stmt | alter_mongodb_connection_stmt | rename_stmt @@ -5907,6 +5913,7 @@ drop_ddl_stmt: | drop_pitr_stmt | drop_cdc_stmt | drop_sql_task_stmt +| drop_materialized_view_stmt | drop_iceberg_catalog_stmt | drop_mongodb_connection_stmt @@ -8674,6 +8681,7 @@ create_ddl_stmt: | create_database_stmt | create_index_stmt | create_view_stmt +| create_materialized_view_stmt | create_function_stmt | create_extension_stmt | create_sequence_stmt @@ -8999,6 +9007,40 @@ func_handler: $$ = $2 } + +create_materialized_view_stmt: + CREATE MATERIALIZED VIEW not_exists_opt table_name mv_refresh_policy AS ctas_select_stmt + { $$ = &tree.CreateMaterializedView{Name:$5, IfNotExists:$4, IntervalSeconds:$6, AsSource:$8} } + +mv_refresh_policy: + REFRESH MANUAL { $$ = 0 } +| REFRESH EVERY INTERVAL INTEGRAL mv_interval_unit + { + n := sqlTaskInt64($4) + if n <= 0 || n > 31536000 / $5 { yylex.Error("invalid materialized view refresh interval"); goto ret1 } + $$ = n * $5 + } + +mv_interval_unit: + SECOND { $$ = 1 } +| MINUTE { $$ = 60 } +| HOUR { $$ = 3600 } +| DAY { $$ = 86400 } + +refresh_materialized_view_stmt: + REFRESH MATERIALIZED VIEW table_name { $$ = &tree.RefreshMaterializedView{Name:$4} } + +drop_materialized_view_stmt: + DROP MATERIALIZED VIEW exists_opt table_name { $$ = &tree.DropMaterializedView{Name:$5, IfExists:$4} } + +alter_materialized_view_stmt: + ALTER MATERIALIZED VIEW table_name mv_refresh_policy { $$ = &tree.AlterMaterializedView{Name:$4, IntervalSeconds:$5} } + +show_materialized_views_stmt: + SHOW MATERIALIZED VIEWS { $$ = &tree.ShowMaterializedViews{} } +| SHOW MATERIALIZED VIEW REFRESHES table_name { $$ = &tree.ShowMaterializedViews{Name:$5, Runs:true} } +| SHOW CREATE MATERIALIZED VIEW table_name { $$ = &tree.ShowMaterializedViews{Name:$5, Create:true} } + create_view_stmt: CREATE view_list_opt VIEW not_exists_opt table_name column_list_opt AS ctas_select_stmt view_tail { @@ -16411,7 +16453,13 @@ equal_opt: //| MYSQL_COMPATIBILITY_MODE non_reserved_keyword: - ACCOUNT + MATERIALIZED +| REFRESH +| MANUAL +| EVERY +| VIEWS +| REFRESHES +| ACCOUNT | JSON_TABLE_PATH | JSON_TABLE_NESTED | JSON_TABLE_ORDINALITY diff --git a/pkg/sql/parsers/tree/materialized_view.go b/pkg/sql/parsers/tree/materialized_view.go new file mode 100644 index 0000000000000..6308a579004c5 --- /dev/null +++ b/pkg/sql/parsers/tree/materialized_view.go @@ -0,0 +1,119 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tree + +import "strconv" + +// A zero interval means manual refresh. Positive intervals are normalized seconds. +type CreateMaterializedView struct { + statementImpl + Name *TableName + AsSource *Select + IfNotExists bool + IntervalSeconds int64 +} + +func formatMVPolicy(ctx *FmtCtx, seconds int64) { + if seconds == 0 { + ctx.WriteString("refresh manual") + } else { + ctx.WriteString("refresh every interval ") + ctx.WriteString(strconv.FormatInt(seconds, 10)) + ctx.WriteString(" second") + } +} + +func (n *CreateMaterializedView) Format(ctx *FmtCtx) { + ctx.WriteString("create materialized view ") + if n.IfNotExists { + ctx.WriteString("if not exists ") + } + n.Name.Format(ctx) + ctx.WriteByte(' ') + formatMVPolicy(ctx, n.IntervalSeconds) + ctx.WriteString(" as ") + n.AsSource.Format(ctx) +} +func (*CreateMaterializedView) GetStatementType() string { return "Create Materialized View" } +func (*CreateMaterializedView) GetQueryType() string { return QueryTypeDDL } +func (*CreateMaterializedView) StmtKind() StmtKind { return defaultStatusTyp } + +type RefreshMaterializedView struct { + statementImpl + Name *TableName +} + +func (n *RefreshMaterializedView) Format(ctx *FmtCtx) { + ctx.WriteString("refresh materialized view ") + n.Name.Format(ctx) +} +func (*RefreshMaterializedView) GetStatementType() string { return "Refresh Materialized View" } +func (*RefreshMaterializedView) GetQueryType() string { return QueryTypeDDL } +func (*RefreshMaterializedView) StmtKind() StmtKind { return frontendStatusTyp } + +type DropMaterializedView struct { + statementImpl + Name *TableName + IfExists bool +} + +func (n *DropMaterializedView) Format(ctx *FmtCtx) { + ctx.WriteString("drop materialized view ") + if n.IfExists { + ctx.WriteString("if exists ") + } + n.Name.Format(ctx) +} +func (*DropMaterializedView) GetStatementType() string { return "Drop Materialized View" } +func (*DropMaterializedView) GetQueryType() string { return QueryTypeDDL } +func (*DropMaterializedView) StmtKind() StmtKind { return frontendStatusTyp } + +type AlterMaterializedView struct { + statementImpl + Name *TableName + IntervalSeconds int64 +} + +func (n *AlterMaterializedView) Format(ctx *FmtCtx) { + ctx.WriteString("alter materialized view ") + n.Name.Format(ctx) + ctx.WriteByte(' ') + formatMVPolicy(ctx, n.IntervalSeconds) +} +func (*AlterMaterializedView) GetStatementType() string { return "Alter Materialized View" } +func (*AlterMaterializedView) GetQueryType() string { return QueryTypeDDL } +func (*AlterMaterializedView) StmtKind() StmtKind { return frontendStatusTyp } + +type ShowMaterializedViews struct { + showImpl + Name *TableName + Runs bool + Create bool +} + +func (n *ShowMaterializedViews) Format(ctx *FmtCtx) { + if n.Create { + ctx.WriteString("show create materialized view ") + n.Name.Format(ctx) + } else if n.Runs { + ctx.WriteString("show materialized view refreshes ") + n.Name.Format(ctx) + } else { + ctx.WriteString("show materialized views") + } +} +func (*ShowMaterializedViews) GetStatementType() string { return "Show Materialized Views" } +func (*ShowMaterializedViews) GetQueryType() string { return QueryTypeOth } +func (*ShowMaterializedViews) StmtKind() StmtKind { return compositeResRowType } diff --git a/pkg/sql/plan/build.go b/pkg/sql/plan/build.go index 73847fed85f81..a092cb17740f6 100644 --- a/pkg/sql/plan/build.go +++ b/pkg/sql/plan/build.go @@ -773,6 +773,8 @@ func BuildPlan(ctx CompilerContext, stmt tree.Statement, isPrepareStmt bool) (re return buildAlterSequence(stmt, ctx) case *tree.DropView: return buildDropView(stmt, ctx) + case *tree.CreateMaterializedView: + return buildCreateMaterializedView(stmt, ctx, isPrepareStmt) case *tree.CreateView: return buildCreateView(stmt, ctx) case *tree.AlterView: diff --git a/pkg/sql/plan/build_constraint_util.go b/pkg/sql/plan/build_constraint_util.go index 0f6f718aa4de7..1da8afc965252 100644 --- a/pkg/sql/plan/build_constraint_util.go +++ b/pkg/sql/plan/build_constraint_util.go @@ -494,6 +494,15 @@ func getUpdateTableInfo(ctx CompilerContext, stmt *tree.Update) (*dmlTableInfo, } func checkTableType(ctx context.Context, tableDef *TableDef, op string) error { + if tableDef.TableType == catalog.SystemMaterializedViewRel { + account, err := defines.GetAccountId(ctx) + if err != nil { + return err + } + if !defines.HasMaterializedViewWrite(ctx, account, tableDef.TblId) { + return moerr.NewInvalidInput(ctx, "materialized view is read only") + } + } if tableDef.TableType == catalog.SystemSourceRel { return moerr.NewInvalidInput(ctx, "cannot insert/update/delete from source") } else if tableDef.TableType == catalog.SystemExternalRel { diff --git a/pkg/sql/plan/build_ddl.go b/pkg/sql/plan/build_ddl.go index 678431328b6c5..09b4587037949 100644 --- a/pkg/sql/plan/build_ddl.go +++ b/pkg/sql/plan/build_ddl.go @@ -2818,6 +2818,9 @@ func buildCreateTable( case *tree.TableOptionProperties: properties := make([]*plan.Property, len(opt.Preperties)) for idx, property := range opt.Preperties { + if property.Key == catalog.MaterializedViewProperty || (property.Key == catalog.SystemRelAttr_Kind && property.Value == catalog.SystemMaterializedViewRel) { + return nil, moerr.NewInvalidInput(ctx.GetContext(), "materialized view properties are reserved") + } properties[idx] = &plan.Property{ Key: property.Key, Value: property.Value, @@ -7715,6 +7718,9 @@ func getForeignKeyData(ctx CompilerContext, dbName string, tableDef *TableDef, d if err != nil { return nil, err } + if parentTableDef != nil && parentTableDef.TableType == catalog.SystemMaterializedViewRel { + return nil, moerr.NewNotSupported(ctx.GetContext(), "foreign keys referencing materialized views") + } if err := validateTableIndexDefinitions(parentTableDef); err != nil { return nil, err } diff --git a/pkg/sql/plan/build_dml_util.go b/pkg/sql/plan/build_dml_util.go index f5b547efe7094..6c1a70dd0714e 100644 --- a/pkg/sql/plan/build_dml_util.go +++ b/pkg/sql/plan/build_dml_util.go @@ -1090,7 +1090,7 @@ func buildDeletePlans(ctx CompilerContext, builder *QueryBuilder, bindCtx *BindC // both UK and SK. To handle SK case, we will have flags to indicate if it's UK or SK. // Temporary DELETE is transactional row DML. A physical replacement would // enter the persistent-table lifecycle using its private physical name. - canTruncate := delCtx.isUnrestrictedDelete && !delCtx.tableDef.IsTemporary + canTruncate := delCtx.isUnrestrictedDelete && !delCtx.tableDef.IsTemporary && delCtx.tableDef.TableType != catalog.SystemMaterializedViewRel enabled, err := IsForeignKeyChecksEnabled(ctx) if err != nil { @@ -7095,7 +7095,7 @@ func buildDeleteIndexPlans(ctx CompilerContext, builder *QueryBuilder, bindCtx * hasSecondaryKey := haveSecondaryKey(delCtx.tableDef) // Keep temporary index maintenance on the same row-delete path as its base // table; skipping it would leave stale index entries after DELETE. - canTruncate := delCtx.isUnrestrictedDelete && !delCtx.tableDef.IsTemporary + canTruncate := delCtx.isUnrestrictedDelete && !delCtx.tableDef.IsTemporary && delCtx.tableDef.TableType != catalog.SystemMaterializedViewRel accountId, err := ctx.GetAccountId() if err != nil { diff --git a/pkg/sql/plan/build_show.go b/pkg/sql/plan/build_show.go index ad4fc3a91dd79..266cbccfba2d6 100644 --- a/pkg/sql/plan/build_show.go +++ b/pkg/sql/plan/build_show.go @@ -368,7 +368,7 @@ func buildShowTables(stmt *tree.ShowTables, ctx CompilerContext) (*Plan, error) var tableType string if stmt.Full { - tableType = fmt.Sprintf(", case relkind when 'v' then 'VIEW' when '%s' then 'CLUSTER TABLE' else 'BASE TABLE' end as Table_type", catalog.SystemClusterRel) + tableType = fmt.Sprintf(", case relkind when 'v' then 'VIEW' when 'm' then 'MATERIALIZED VIEW' when '%s' then 'CLUSTER TABLE' else 'BASE TABLE' end as Table_type", catalog.SystemClusterRel) } subName := dbName diff --git a/pkg/sql/plan/build_table_clone.go b/pkg/sql/plan/build_table_clone.go index 3cc4185a56bf3..93aa332fc4911 100644 --- a/pkg/sql/plan/build_table_clone.go +++ b/pkg/sql/plan/build_table_clone.go @@ -94,6 +94,9 @@ func buildCloneTable( "table %v-%v does not exist", stmt.SrcTable.Schema(), stmt.SrcTable.Name()) } + if srcTblDef.TableType == catalog.SystemMaterializedViewRel { + return nil, moerr.NewNotSupported(ctx.GetContext(), "CLONE of materialized views") + } var ( dstTableName string dstDatabaseName string diff --git a/pkg/sql/plan/explain/sql_json_test.go b/pkg/sql/plan/explain/sql_json_test.go index a2c10bcb55196..fe8f96fa7fe40 100644 --- a/pkg/sql/plan/explain/sql_json_test.go +++ b/pkg/sql/plan/explain/sql_json_test.go @@ -1310,3 +1310,59 @@ func TestBuildSQLJSONPlanRejectsMalformedIndexSearchMetadata(t *testing.T) { }) } } + +func TestBuildSQLJSONPlanIndexSearchMetadataBoundaries(t *testing.T) { + for _, tc := range []struct { + name string + spec *plan.IndexSearchScan + }{ + {"missing metadata", nil}, + {"missing index", &plan.IndexSearchScan{}}, + {"unpaired algorithm expression", &plan.IndexSearchScan{ + Index: &plan.IndexDef{IndexName: "idx"}, AlgoExprs: []*plan.Expr{sqlJSONTestInt32(1)}, + }}, + {"empty algorithm expression name", &plan.IndexSearchScan{ + Index: &plan.IndexDef{IndexName: "idx"}, AlgoExprs: []*plan.Expr{sqlJSONTestInt32(1)}, AlgoExprNames: []string{""}, + }}, + {"malformed plugin options", &plan.IndexSearchScan{ + Index: &plan.IndexDef{IndexName: "idx", IndexAlgo: "ivfflat"}, AlgoOptions: []byte(`{`), + }}, + } { + t.Run(tc.name, func(t *testing.T) { + _, err := BuildSQLJSONPlan(t.Context(), &plan.Query{ + StmtType: plan.Query_SELECT, Steps: []int32{0}, + Nodes: []*plan.Node{{NodeType: plan.Node_INDEX_SEARCH_SCAN, IndexSearchScan: tc.spec}}, + }) + require.Error(t, err) + }) + } + + for _, tc := range []struct { + name string + node *plan.Node + }{ + {"fulltext", fulltextSearchScanNode(t)}, + {"opaque settings", &plan.Node{ + NodeType: plan.Node_INDEX_SEARCH_SCAN, + IndexSearchScan: &plan.IndexSearchScan{ + Index: &plan.IndexDef{IndexName: "idx", IndexAlgo: "unregistered"}, + AlgoOptions: []byte{0, 0xff, 1}, + }, + }}, + } { + t.Run(tc.name, func(t *testing.T) { + data, err := BuildSQLJSONPlan(t.Context(), &plan.Query{ + StmtType: plan.Query_SELECT, Steps: []int32{0}, Nodes: []*plan.Node{tc.node}, + }) + require.NoError(t, err) + var decoded sqlJSONPlan + require.NoError(t, json.Unmarshal(data, &decoded)) + require.Len(t, decoded.MatrixOne.Nodes, 1) + require.Contains(t, decoded.MatrixOne.Nodes[0].Expressions, fmt.Sprintf("algo_options=0x%X", tc.node.IndexSearchScan.AlgoOptions)) + if tc.name == "fulltext" { + require.Equal(t, "Fulltext Index Scan", decoded.MatrixOne.Nodes[0].Operator) + require.Contains(t, decoded.MatrixOne.Nodes[0].Expressions, "index=ft_body") + } + }) + } +} diff --git a/pkg/sql/plan/materialized_view.go b/pkg/sql/plan/materialized_view.go new file mode 100644 index 0000000000000..e8e97ae70da49 --- /dev/null +++ b/pkg/sql/plan/materialized_view.go @@ -0,0 +1,263 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package plan + +import ( + "encoding/json" + "reflect" + "strings" + "time" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/defines" + pb "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect/mysql" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/matrixorigin/matrixone/pkg/vm/process" +) + +// ValidateMaterializedViewSelect is a bounded definition-time AST check. This +// deliberately admits a smaller language than ordinary SELECT in the first release. +func ValidateMaterializedViewSelect(ctx CompilerContext, stmt *tree.Select) error { + if stmt == nil || stmt.With != nil || stmt.Limit != nil || len(stmt.OrderBy) != 0 || stmt.RankOption != nil || stmt.TimeWindow != nil || stmt.SelectLockInfo != nil || stmt.Ep != nil || len(stmt.IntoVars) != 0 { + return moerr.NewNotSupported(ctx.GetContext(), "materialized view requires a deterministic native-table SELECT without CTE, ORDER BY, LIMIT, window, snapshot or locking clauses") + } + clause, ok := stmt.Select.(*tree.SelectClause) + if !ok || clause.Distinct || len(clause.Windows) != 0 || clause.IntoExport != nil || len(clause.IntoVars) != 0 { + return moerr.NewNotSupported(ctx.GetContext(), "materialized view query shape") + } + count := 0 + var walk func(reflect.Value, int) error + walk = func(v reflect.Value, depth int) error { + if !v.IsValid() { + return nil + } + if depth > 128 || count > 4096 { + return moerr.NewInvalidInput(ctx.GetContext(), "materialized view definition exceeds binding budget") + } + count++ + if v.Kind() == reflect.Interface { + if v.IsNil() { + return nil + } + return walk(v.Elem(), depth+1) + } + if v.Kind() == reflect.Pointer { + if v.IsNil() { + return nil + } + if v.CanInterface() { + switch n := v.Interface().(type) { + case *tree.VarExpr, *tree.Subquery, *tree.Select, *tree.SampleExpr, *tree.ParamExpr, *tree.DefaultVal: + return moerr.NewNotSupported(ctx.GetContext(), "materialized view variable or subquery") + case *tree.JoinTableExpr: + if n.Right != nil && n.JoinType != tree.JOIN_TYPE_INNER && n.JoinType != "" { + return moerr.NewNotSupported(ctx.GetContext(), "materialized view supports inner joins only") + } + case *tree.GroupByClause: + if n.Cube || n.Rollup || n.GroupingSets { + return moerr.NewNotSupported(ctx.GetContext(), "materialized view grouping sets") + } + case *tree.TableName: + if n.AtTsExpr != nil { + return moerr.NewNotSupported(ctx.GetContext(), "materialized view historical source") + } + case *tree.FuncExpr: + if n.WindowSpec != nil || n.Type == tree.FUNC_TYPE_DISTINCT || n.FuncName == nil { + return moerr.NewNotSupported(ctx.GetContext(), "materialized view aggregate/function shape") + } + name := strings.ToLower(n.FuncName.Compare()) + ref, ok := n.Func.FunctionReference.(*tree.UnresolvedName) + if !ok || ref.NumParts != 1 || n.IsGeneric && mysql.IsSQLModeSensitiveFunctionName(name) { + return moerr.NewNotSupported(ctx.GetContext(), "materialized view qualified or user-defined function") + } + switch name { + case "sum", "count", "min", "max", "avg", "cast", "abs", "coalesce", "ifnull", "if", "year", "month", "date", "date_trunc", "concat", "concat_ws": + default: + return moerr.NewNotSupportedf(ctx.GetContext(), "materialized view function %s", name) + } + } + } + return walk(v.Elem(), depth+1) + } + switch v.Kind() { + case reflect.Struct: + for i := 0; i < v.NumField(); i++ { + if v.Type().Field(i).PkgPath == "" { + if err := walk(v.Field(i), depth+1); err != nil { + return err + } + } + } + case reflect.Slice: + for i := 0; i < v.Len(); i++ { + if err := walk(v.Index(i), depth+1); err != nil { + return err + } + } + } + return nil + } + return walk(reflect.ValueOf(clause), 0) +} + +func buildCreateMaterializedView(stmt *tree.CreateMaterializedView, ctx CompilerContext, isPrepare bool) (*Plan, error) { + enabled, enableErr := ctx.ResolveVariable("experimental_materialized_view", true, false) + if enableErr != nil { + return nil, enableErr + } + if enabled != int8(1) && enabled != int64(1) && enabled != uint64(1) && enabled != true { + return nil, moerr.NewNotSupported(ctx.GetContext(), "enable experimental_materialized_view before creating a materialized view") + } + if err := RequirePersistedProtocolVersionForAuthoring(ctx.GetContext(), ctx.GetProcess(), defines.MORPCVersion119); err != nil { + return nil, err + } + if stmt.IntervalSeconds != 0 && stmt.IntervalSeconds < 60 { + return nil, moerr.NewInvalidInput(ctx.GetContext(), "materialized view refresh interval must be at least 60 seconds") + } + if err := ValidateMaterializedViewSelect(ctx, stmt.AsSource); err != nil { + return nil, err + } + db := string(stmt.Name.SchemaName) + if db == "" { + db = ctx.DefaultDatabase() + } + if !catalog.IsMaterializedViewDatabase(db) { + return nil, moerr.NewInvalidInput(ctx.GetContext(), "materialized view requires a user database") + } + account, err := ctx.GetAccountId() + if err != nil { + return nil, err + } + inferred, err := inferViewColumns(&materializedViewSourceContext{CompilerContext: ctx, database: db}, stmt.AsSource, nil, db, string(stmt.Name.ObjectName), true) + if err != nil { + return nil, err + } + if len(inferred.dependencies) == 0 || len(inferred.dependencies) > 16 || len(inferred.columns) > 256 { + return nil, moerr.NewInvalidInput(ctx.GetContext(), "materialized view requires 1..16 native sources and at most 256 columns") + } + names := make(map[string]struct{}, len(inferred.columns)) + for _, column := range inferred.columns { + name := strings.ToLower(column.Name) + if _, duplicate := names[name]; duplicate { + return nil, moerr.NewInvalidInput(ctx.GetContext(), "materialized view output names must be unique; use explicit aliases") + } + names[name] = struct{}{} + } + precision := resolveDivPrecisionIncrement(ctx) + definition := catalog.MVDefinition{FormatVersion: catalog.MVDefinitionFormatVersion, DivPrecisionIncrement: &precision, TimeZoneKind: "fixed", TimeZone: "UTC", Database: db, IntervalSeconds: stmt.IntervalSeconds, LowerCaseTableNames: ctx.GetLowerCaseTableNames(), OwnerUser: defines.GetUserId(ctx.GetContext()), OwnerRole: defines.GetRoleId(ctx.GetContext()), OwnerName: materializedViewOwnerName(ctx.GetUserName())} + if mode := parserSQLModeFromContext(ctx); mode != nil { + definition.SQLMode = *mode + } + if proc := ctx.GetProcess(); proc != nil && proc.GetSessionInfo().TimeZone != nil { + zone := proc.GetSessionInfo().TimeZone + if name := process.TimeZoneLocationName(zone); name != "" { + definition.TimeZoneKind, definition.TimeZone = "named", name + } else if process.IsFixedTimeZone(zone) { + definition.TimeZone = zone.String() + } else { + return nil, moerr.NewInvalidInput(ctx.GetContext(), "select an explicit named or fixed time_zone before creating a materialized view") + } + _, offset := time.Now().In(zone).Zone() + definition.TimeZoneOffset = int32(offset) + } + for _, d := range inferred.dependencies { + _, sourceDef, resolveErr := ctx.Resolve(d.DatabaseName, d.RelationName, nil) + if resolveErr != nil { + return nil, resolveErr + } + if sourceDef == nil || sourceDef.IsTemporary { + return nil, moerr.NewNotSupported(ctx.GetContext(), "materialized view temporary source") + } + if d.AccountID != account || d.DatabaseName != db || d.RelationKind != catalog.SystemOrdinaryRel || d.SubscriptionName != "" || IsSnapshotValid(d.Snapshot) { + return nil, moerr.NewNotSupported(ctx.GetContext(), "materialized view sources must be persistent native tables in the same account/database") + } + definition.Sources = append(definition.Sources, catalog.MVSource{AccountID: d.AccountID, DatabaseID: d.DatabaseID, TableID: d.RelationID, LogicalID: d.LogicalID, Version: d.Version, Database: d.DatabaseName, Table: d.RelationName}) + } + source := stmt.AsSource + if stable, ok := viewSelectWithExpandedStars(source, inferred.expandedSelectLists); ok { + source = stable + } + definition.Query = tree.StringWithOpts(source, dialect.MYSQL, tree.WithQuoteIdentifier(), tree.WithSingleQuoteString(), tree.WithModeIndependentStringLiterals()) + stableStatement := *stmt + stableStatement.AsSource = source + definition.CreateSQL = tree.StringWithOpts(&stableStatement, dialect.MYSQL, tree.WithQuoteIdentifier(), tree.WithSingleQuoteString(), tree.WithModeIndependentStringLiterals()) + if len(definition.Query) > 65536 { + return nil, moerr.NewInvalidInput(ctx.GetContext(), "materialized view query exceeds 64 KiB") + } + ctas := &tree.CreateTable{Table: *stmt.Name, IfNotExists: stmt.IfNotExists, IsAsSelect: true, AsSource: source} + p, err := buildCreateTable(ctx, ctas, nil, isPrepare) + if err != nil { + return nil, err + } + c := p.GetDdl().GetCreateTable() + c.CreateAsSelectSql = "" + p.GetDdl().Query = nil + c.TableDef.TableType = catalog.SystemMaterializedViewRel + data, err := json.Marshal(definition) + if err != nil { + return nil, err + } + for _, d := range c.TableDef.Defs { + if props := d.GetProperties(); props != nil { + for _, pr := range props.Properties { + if pr.Key == catalog.SystemRelAttr_Kind { + pr.Value = catalog.SystemMaterializedViewRel + } + if pr.Key == catalog.SystemRelAttr_CreateSQL { + pr.Value = definition.CreateSQL + } + } + } + } + c.TableDef.Defs = append(c.TableDef.Defs, &pb.TableDef_DefType{Def: &pb.TableDef_DefType_Properties{Properties: &pb.PropertiesDef{Properties: []*pb.Property{{Key: catalog.MaterializedViewProperty, Value: string(data)}}}}}) + return p, nil +} + +// Reject unsupported source kinds at resolution, before view expansion or an +// external connector can run. Capturing dependencies after expansion alone is +// too late to enforce the P1 native-source contract. +type materializedViewSourceContext struct { + CompilerContext + database string +} + +func (c *materializedViewSourceContext) Resolve(database, table string, snapshot *Snapshot) (*ObjectRef, *TableDef, error) { + if database == "" { + database = c.DefaultDatabase() + } + if database != c.database || IsSnapshotValid(snapshot) { + return nil, nil, moerr.NewNotSupported(c.GetContext(), "materialized view sources require the current native database") + } + ref, def, err := c.CompilerContext.Resolve(database, table, snapshot) + if err != nil || def == nil { + return ref, def, err + } + if def.TableType != catalog.SystemOrdinaryRel || def.IsTemporary || ref != nil && (ref.PubInfo != nil || ref.SubscriptionName != "") { + return nil, nil, moerr.NewNotSupported(c.GetContext(), "materialized view sources must be persistent native tables") + } + return ref, def, nil +} + +// The wire username may include account and role, unlike mo_user.user_name. +func materializedViewOwnerName(wire string) string { + parts := strings.Split(wire, ":") + if len(parts) >= 2 { + return parts[1] + } + return wire +} diff --git a/pkg/sql/plan/materialized_view_test.go b/pkg/sql/plan/materialized_view_test.go new file mode 100644 index 0000000000000..7c4cab6899cea --- /dev/null +++ b/pkg/sql/plan/materialized_view_test.go @@ -0,0 +1,247 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package plan + +import ( + "context" + "testing" + "time" + + "github.com/matrixorigin/matrixone/pkg/vm/process" + + "github.com/golang/mock/gomock" + "github.com/matrixorigin/matrixone/pkg/catalog" + moruntime "github.com/matrixorigin/matrixone/pkg/common/runtime" + "github.com/matrixorigin/matrixone/pkg/defines" + pb "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect/mysql" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/stretchr/testify/require" +) + +func TestMaterializedViewRefreshDeleteRetainsRelation(t *testing.T) { + for _, kind := range []string{catalog.SystemOrdinaryRel, catalog.SystemMaterializedViewRel} { + t.Run(kind, func(t *testing.T) { + proc := newPlanTestProcess(t) + ctx := NewMockCompilerContext(true, proc) + table := ctx.tables["nation"] + table.TableType = kind + ctx.SetContext(defines.WithMaterializedViewWrite( + defines.AttachAccountId(proc.Ctx, 0), 0, table.TblId, []byte("refresh"))) + stmt, err := mysql.ParseOne(ctx.GetContext(), "delete from tpch.nation", 1) + require.NoError(t, err) + defer stmt.Free() + // Unrestricted DELETE reaches the legacy planner, which must keep + // the MV's physical identity for the refresh publication transaction. + p, err := buildDelete(stmt.(*tree.Delete), ctx, false) + require.NoError(t, err) + found := false + for _, node := range p.GetQuery().Nodes { + if node.NodeType == pb.Node_DELETE && node.DeleteCtx.TableDef.TblId == table.TblId { + found = true + require.Equal(t, kind == catalog.SystemOrdinaryRel, node.DeleteCtx.CanTruncate) + } + } + require.True(t, found, "expected an origin-table DELETE node") + }) + } +} + +func TestMaterializedViewSelectContract(t *testing.T) { + ctx := NewMockCompilerContext2(gomock.NewController(t)) + ctx.EXPECT().GetContext().Return(context.Background()).AnyTimes() + for _, tc := range []struct { + sql string + allowed bool + }{ + {"select k,sum(v),count(*),min(v),max(v),avg(v) from t where v>0 group by k", true}, + {"select a.k,b.v from a inner join b on a.k=b.k", true}, + {"select a.k,b.v from a left join b on a.k=b.k", false}, + {"select rand() from t", false}, {"select now() from t", false}, + {"select distinct k from t", false}, {"select count(distinct k) from t", false}, + {"select k from t limit 1", false}, {"select k from t order by k", false}, + {"select @secret from t", false}, {"select k from t where k in (select k from s)", false}, + {"with x as (select * from t) select * from x", false}, + {"select row_number() over (order by k) from t", false}, + {"select k from t union all select k from s", false}, + {"select sample(k, 1 rows) from t", false}, + {"select ? from t", false}, + {"select uuid() from t", false}, + {"select sum (v) from t", false}, + {"select current_timestamp() from t", false}, + {"select k from t for update", false}, + {"select a.k from a cross join b", false}, + {"select a.k from a right join b on a.k=b.k", false}, + {"select k,sum(v) from t group by k with rollup", false}, + {"select k from t {MO_TS = 123}", false}, + {"select k from t {SNAPSHOT = 'snapshot'}", false}, + {"select cast(v as decimal(20,2)),abs(v),coalesce(v,0) from t where k is not null", true}, + {"select k,sum(v) from t group by k having sum(v)>10", true}, + {"select concat(k,'x') from t", true}, + } { + t.Run(tc.sql, func(t *testing.T) { + stmts, err := mysql.Parse(context.Background(), tc.sql, 1) + require.NoError(t, err) + defer stmts[0].Free() + err = ValidateMaterializedViewSelect(ctx, stmts[0].(*tree.Select)) + if tc.allowed { + require.NoError(t, err) + } else { + require.Error(t, err) + } + }) + } +} + +type materializedViewPlanContext struct { + *MockCompilerContext + enabled bool +} + +func (c *materializedViewPlanContext) ResolveVariable(name string, system, global bool) (interface{}, error) { + if name == "experimental_materialized_view" { + if c.enabled { + return int8(1), nil + } + return int8(0), nil + } + return c.MockCompilerContext.ResolveVariable(name, system, global) +} +func TestMaterializedViewCreatePlan(t *testing.T) { + for _, scenario := range []string{"aggregate", "star", "gate disabled", "old protocol", "old authoring floor", "temporary source", "view source", "cross database", "short interval", "duplicate headings"} { + t.Run(scenario, func(t *testing.T) { + proc := newPlanTestProcess(t) + proc.GetSessionInfo().TimeZone = time.UTC + base := NewMockCompilerContext(false, proc) + base.SetContext(proc.Ctx) + ctx := &materializedViewPlanContext{base, true} + setPlanTestGlobalVariable(t, proc.GetService(), moruntime.MOProtocolVersion, int64(defines.MORPCVersion119)) + setPlanTestGlobalVariable(t, proc.GetService(), moruntime.PersistedExpressionProtocolAuthoringFloor, int64(defines.MORPCVersion119)) + query := "create materialized view stored refresh manual as select n_regionkey,sum(n_nationkey) as s,count(*) as n from nation group by n_regionkey" + switch scenario { + case "star": + query = "create materialized view stored refresh manual as select * from nation" + case "gate disabled": + ctx.enabled = false + case "old protocol": + setPlanTestGlobalVariable(t, proc.GetService(), moruntime.MOProtocolVersion, int64(defines.MORPCVersion118)) + case "old authoring floor": + setPlanTestGlobalVariable(t, proc.GetService(), moruntime.PersistedExpressionProtocolAuthoringFloor, int64(defines.MORPCVersion118)) + case "temporary source": + base.tables["nation"].IsTemporary = true + case "view source": + base.tables["nation"].TableType = catalog.SystemViewRel + case "cross database": + query = "create materialized view bvt_test1.stored refresh manual as select * from tpch.nation" + case "short interval": + query = "create materialized view stored refresh every interval 1 second as select * from nation" + case "duplicate headings": + query = "create materialized view stored refresh manual as select n_nationkey as x,n_regionkey as x from nation" + } + stmt, err := mysql.ParseOne(proc.Ctx, query, 1) + require.NoError(t, err) + defer stmt.Free() + p, err := BuildPlan(ctx, stmt, false) + if scenario != "aggregate" && scenario != "star" { + require.Error(t, err) + return + } + require.NoError(t, err) + create := p.GetDdl().GetCreateTable() + require.NotNil(t, create) + require.Empty(t, create.CreateAsSelectSql) + require.Nil(t, p.GetDdl().Query) + require.Equal(t, catalog.SystemMaterializedViewRel, create.TableDef.TableType) + definition, err := catalog.MaterializedViewDefinition(create.TableDef) + require.NoError(t, err) + require.Len(t, definition.Sources, 1) + require.Equal(t, "nation", definition.Sources[0].Table) + require.Equal(t, "tpch", definition.Database) + require.NotContains(t, definition.Query, "select *") + if scenario == "aggregate" { + require.Equal(t, "n_regionkey", create.TableDef.Cols[0].Name) + require.Equal(t, "s", create.TableDef.Cols[1].Name) + require.Equal(t, "n", create.TableDef.Cols[2].Name) + } + }) + } +} + +func TestMaterializedViewCatalogPlans(t *testing.T) { + ctx := NewMockCompilerContext(false, newPlanTestProcess(t)) + for _, ddl := range catalog.MaterializedViewCatalogDDLs { + stmt, err := mysql.ParseOne(context.Background(), ddl, 1) + require.NoError(t, err) + func() { + defer stmt.Free() + p, err := BuildPlan(ctx, stmt, false) + require.NoError(t, err) + kind := "" + for _, def := range p.GetDdl().GetCreateTable().TableDef.Defs { + if props := def.GetProperties(); props != nil { + for _, property := range props.Properties { + if property.Key == catalog.SystemRelAttr_Kind { + kind = property.Value + } + } + } + } + require.Equal(t, catalog.SystemClusterRel, kind) + require.NotNil(t, FindColumn(p.GetDdl().GetCreateTable().TableDef.Cols, "account_id")) + require.NotNil(t, p.GetDdl().GetCreateTable().TableDef.Pkey) + }() + } +} + +func TestMaterializedViewAuthoringTimeZoneIdentity(t *testing.T) { + for _, name := range []string{"America/New_York", "fixed named like IANA", "Local"} { + t.Run(name, func(t *testing.T) { + zone, err := time.LoadLocation("America/New_York") + require.NoError(t, err) + if name == "fixed named like IANA" { + zone = time.FixedZone("America/New_York", 3600) + } + if name == "Local" { + zone = time.Local + if process.IsFixedTimeZone(zone) { + t.Skip("this host's Local has no rules; fixed identity is covered separately") + } + } + proc := newPlanTestProcess(t) + proc.GetSessionInfo().TimeZone = zone + ctx := &materializedViewPlanContext{NewMockCompilerContext(false, proc), true} + ctx.SetContext(proc.Ctx) + setPlanTestGlobalVariable(t, proc.GetService(), moruntime.MOProtocolVersion, int64(defines.MORPCVersion119)) + setPlanTestGlobalVariable(t, proc.GetService(), moruntime.PersistedExpressionProtocolAuthoringFloor, int64(defines.MORPCVersion119)) + stmt, err := mysql.ParseOne(proc.Ctx, "create materialized view stored refresh manual as select * from nation", 1) + require.NoError(t, err) + defer stmt.Free() + p, err := BuildPlan(ctx, stmt, false) + if name == "Local" { + require.ErrorContains(t, err, "explicit named or fixed time_zone") + return + } + require.NoError(t, err) + def, err := catalog.MaterializedViewDefinition(p.GetDdl().GetCreateTable().TableDef) + require.NoError(t, err) + want := "named" + if name == "fixed named like IANA" { + want = "fixed" + } + require.Equal(t, want, def.TimeZoneKind) + require.Equal(t, "America/New_York", def.TimeZone) + }) + } +} diff --git a/pkg/sql/plan/nullif_rebind_test.go b/pkg/sql/plan/nullif_rebind_test.go index 8069c95ae431c..e742295e1b0c1 100644 --- a/pkg/sql/plan/nullif_rebind_test.go +++ b/pkg/sql/plan/nullif_rebind_test.go @@ -58,6 +58,9 @@ func TestInitNullMapRebindReturnsSameRules(t *testing.T) { require.NoError(t, InitNullMap(param, nil)) require.Equal(t, tc.want, param.NullMap, "rebind %d", pass) } + for i, assignment := range param.Tail.Assignments { + require.Nil(t, assignment.Expr, "assignment %d must be consumed before serialization", i) + } // The stored external-table parameter must retain the same rules // after repeated binding and a remote JSON round trip. raw, err := json.Marshal(param) diff --git a/pkg/sql/plan/query_builder.go b/pkg/sql/plan/query_builder.go index b85e4ba0df81a..ad2607f50337d 100644 --- a/pkg/sql/plan/query_builder.go +++ b/pkg/sql/plan/query_builder.go @@ -13010,6 +13010,9 @@ func (builder *QueryBuilder) buildTable(stmt tree.TableExpr, ctx *BindContext, t return 0, "", err } + if tableDef.TableType == catalog.SystemMaterializedViewRel && obj.PubInfo != nil { + return 0, "", moerr.NewNotSupported(builder.GetContext(), "materialized views through subscriptions/publications") + } // Empty-result rewrites can remove scans, not semantic dependencies. // Capture evidence before optimization, including intermediate Views, // snapshots, and ordinary tables that may later be replaced by Views. @@ -13250,6 +13253,8 @@ func (builder *QueryBuilder) buildTable(stmt tree.TableExpr, ctx *BindContext, t } } else if tableDef.TableType == catalog.SystemSourceRel { return 0, "", moerr.NewNotSupportedf(builder.GetContext(), "source table %s.%s", schema, table) + } else if tableDef.TableType == catalog.SystemMaterializedViewRel && (builder.isHistoricalSnapshot(snapshot) || IsSnapshotValid(builder.compCtx.GetSnapshot())) { + return 0, "", moerr.NewNotSupported(builder.GetContext(), "historical materialized view reads") } else if tableDef.TableType == catalog.SystemViewRel { // CREATE OR REPLACE VIEW and ALTER VIEW change the current catalog // object. A same-named View resolved from an explicit historical diff --git a/pkg/tests/issues/issue_29400_test.go b/pkg/tests/issues/issue_29400_test.go index 86e0bf5007f3a..207b69176b512 100644 --- a/pkg/tests/issues/issue_29400_test.go +++ b/pkg/tests/issues/issue_29400_test.go @@ -623,7 +623,10 @@ func TestIssue29400CopyAlterRetainedGatePromotionFastFails(t *testing.T) { execSQLRequire(t, ctx, db0, "create table "+solo+".fk_guard(i int)") holder, err := db0.BeginTx(ctx, nil) require.NoError(t, err) - operationCtx, cancelOperation := context.WithTimeout(ctx, 15*time.Second) + // The waiter stays blocked while we inspect catalogs and commit + // its lock holder. Bound it by the existing test deadline rather + // than charging that coordination/commit I/O to a second timer. + operationCtx, cancelOperation := context.WithCancel(ctx) defer cancelOperation() var done chan error finished := false diff --git a/pkg/tests/sqlintegration/materialized_view_semantics_test.go b/pkg/tests/sqlintegration/materialized_view_semantics_test.go new file mode 100644 index 0000000000000..fa986df312862 --- /dev/null +++ b/pkg/tests/sqlintegration/materialized_view_semantics_test.go @@ -0,0 +1,230 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sqlintegration + +import ( + "context" + "database/sql" + "fmt" + "strings" + "testing" + "time" + + "github.com/go-sql-driver/mysql" + "github.com/matrixorigin/matrixone/pkg/embed" + "github.com/stretchr/testify/require" +) + +// One authenticated shared fixture covers persisted semantics and live reads. +// Values and wire column scales are independent oracles, not plan self-checks. +func TestMaterializedViewCapturedSemantics(t *testing.T) { + runSQLIntegration(t, func(c embed.Cluster) { + cn, err := c.GetCNService(0) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) + defer cancel() + port := cn.GetServiceConfig().CN.Frontend.Port + db, err := sql.Open("mysql", fmt.Sprintf("dump:111@tcp(127.0.0.1:%d)/", port)) + require.NoError(t, err) + defer db.Close() + conn, err := db.Conn(ctx) + require.NoError(t, err) + defer conn.Close() + const schema = "mv_captured_semantics" + views := []string{"precision_0", "precision_4", "precision_10", "precision_30", "mode_mv", "named_mv", "fixed_mv", "failure_mv"} + cleanup := make([]string, 0, len(views)+3) + cleanup = append(cleanup, "drop user if exists mv_semantics_reader", "drop role if exists mv_semantics_role") + for _, v := range views { + cleanup = append(cleanup, "drop materialized view if exists "+schema+"."+v) + } + cleanup = append(cleanup, "drop database if exists "+schema) + defer func() { cleanupSQLIntegration(t, cn, cleanup...) }() + exec := func(q string, args ...any) { + t.Helper() + _, err := conn.ExecContext(ctx, q, args...) + require.NoError(t, err, q) + } + scalar := func(q string) string { + t.Helper() + var s string + require.NoError(t, conn.QueryRowContext(ctx, q).Scan(&s), q) + return s + } + reject := func(q, reason string) { + t.Helper() + _, err := conn.ExecContext(ctx, q) + require.ErrorContains(t, err, reason, q) + } + empty := func(q sqlQuerier) { + t.Helper() + rows, err := q.QueryContext(ctx, "select * from precision_10 limit 0") + require.NoError(t, err) + defer rows.Close() + cols, err := rows.ColumnTypes() + require.NoError(t, err) + require.Len(t, cols, 1) + require.False(t, rows.Next()) + require.NoError(t, rows.Err()) + } + exec("create database " + schema) + exec("use " + schema) + exec("set experimental_materialized_view=1") + exec("set time_zone='+00:00'") + exec("create table facts(a decimal(10,0))") + exec("insert into facts values(1)") + for _, precision := range []int{0, 4, 10, 30} { + name := fmt.Sprintf("precision_%d", precision) + exec(fmt.Sprintf("set div_precision_increment=%d", precision)) + exec("create materialized view " + name + " refresh manual as select a/3 as q from facts") + reject("select * from "+name+" limit 0", "MV_NOT_POPULATED") + reject("select * from "+name+" where false", "MV_NOT_POPULATED") + exec("set div_precision_increment=4") + exec("refresh materialized view " + name) + rows, err := conn.QueryContext(ctx, "select q from "+name) + require.NoError(t, err) + func() { + defer rows.Close() + cols, err := rows.ColumnTypes() + require.NoError(t, err) + require.Len(t, cols, 1) + _, scale, ok := cols[0].DecimalSize() + require.True(t, ok) + require.Equal(t, int64(precision), scale) + require.True(t, rows.Next()) + var got string + require.NoError(t, rows.Scan(&got)) + want := "0" + if precision > 0 { + want = "0." + strings.Repeat("3", precision) + } + require.Equal(t, want, got) + require.False(t, rows.Next()) + require.NoError(t, rows.Err()) + }() + } + empty(conn) + func() { + rows, err := conn.QueryContext(ctx, "select * from facts limit 0") + require.NoError(t, err) + defer rows.Close() + require.False(t, rows.Next()) + require.NoError(t, rows.Err()) + }() + exec("set sql_mode='NO_UNSIGNED_SUBTRACTION'") + exec("create materialized view mode_mv refresh manual as select cast(a as unsigned)-2 as q from facts") + exec("set sql_mode=''") + exec("refresh materialized view mode_mv") + require.Equal(t, "-1", scalar("select q from mode_mv")) + exec("create table dates(id int,ts timestamp)") + exec("insert into dates values(1,'2024-01-15 12:00:00'),(2,'2024-07-15 12:00:00')") + exec("set time_zone='America/New_York'") + exec("create materialized view named_mv refresh manual as select id,cast(ts as datetime) as local_dt from dates") + exec("set time_zone='+08:00'") + exec("create materialized view fixed_mv refresh manual as select id,cast(ts as datetime) as local_dt from dates") + exec("set time_zone='+00:00'") + exec("refresh materialized view named_mv") + exec("refresh materialized view fixed_mv") + require.Equal(t, "2024-01-15 07:00:00", scalar("select local_dt from named_mv where id=1")) + require.Equal(t, "2024-07-15 08:00:00", scalar("select local_dt from named_mv where id=2")) + require.Equal(t, "2024-01-15 20:00:00", scalar("select local_dt from fixed_mv where id=1")) + require.Equal(t, "2024-07-15 20:00:00", scalar("select local_dt from fixed_mv where id=2")) + exec("create role mv_semantics_role") + exec("create user mv_semantics_reader identified by 'mv-fixture-only'") + exec("grant select on table " + schema + ".precision_10 to mv_semantics_role") + exec("grant mv_semantics_role to mv_semantics_reader") + readerConfig := mysql.NewConfig() + readerConfig.User, readerConfig.Passwd = "sys:mv_semantics_reader:mv_semantics_role", "mv-fixture-only" + readerConfig.Net, readerConfig.Addr, readerConfig.DBName = "tcp", fmt.Sprintf("127.0.0.1:%d", port), schema + readerConnector, err := mysql.NewConnector(readerConfig) + require.NoError(t, err) + reader := sql.OpenDB(readerConnector) + defer reader.Close() + reader.SetMaxOpenConns(1) + func() { + rows, err := reader.QueryContext(ctx, "select * from precision_10 limit 0") + if rows != nil { + defer rows.Close() + require.False(t, rows.Next()) + require.NoError(t, rows.Err()) + } + require.Error(t, err, "MV grant alone does not grant source SELECT") + }() + exec("grant select on table " + schema + ".facts to mv_semantics_role") + empty(reader) + p, err := reader.PrepareContext(ctx, "select * from precision_10 limit 0") + require.NoError(t, err) + defer p.Close() + preparedEmpty := func() { + t.Helper() + rows, err := p.QueryContext(ctx) + require.NoError(t, err) + defer rows.Close() + require.False(t, rows.Next()) + require.NoError(t, rows.Err()) + } + preparedEmpty() + exec("revoke select on table " + schema + ".facts from mv_semantics_role") + func() { + rows, err := p.QueryContext(ctx) + if rows != nil { + defer rows.Close() + require.False(t, rows.Next()) + require.NoError(t, rows.Err()) + } + require.Error(t, err, "prepared LIMIT 0 must recheck live source grants") + }() + exec("grant select on table " + schema + ".facts to mv_semantics_role") + preparedEmpty() + exec("create table failure_source(id int,v bigint)") + exec("insert into failure_source values(1,0)") + exec("create materialized view failure_mv refresh manual as select id,v+9223372036854775807 as v from failure_source") + exec("refresh materialized view failure_mv") + before := scalar("select concat(last_run,':',successful_sequence,':',source_physical,':',source_logical) from mo_catalog.mo_materialized_views where database_name='" + schema + "' and name='failure_mv'") + exec("update failure_source set v=1") + _, err = conn.ExecContext(ctx, "refresh materialized view failure_mv") + require.Error(t, err) + require.Equal(t, "9223372036854775807", scalar("select v from failure_mv")) + require.Equal(t, before, scalar("select concat(last_run,':',successful_sequence,':',source_physical,':',source_logical) from mo_catalog.mo_materialized_views where database_name='"+schema+"' and name='failure_mv'")) + _, err = conn.ExecContext(ctx, "alter table facts add column unrelated int") + require.Error(t, err, "dependency guard survives integration") + old := scalar("select rel_id from mo_catalog.mo_tables where reldatabase='" + schema + "' and relname='precision_4'") + exec("drop materialized view precision_4") + require.Equal(t, "0", scalar("select count(*) from mo_catalog.mo_materialized_views where database_name='"+schema+"' and name='precision_4'")) + exec("set div_precision_increment=10") + exec("create materialized view precision_4 refresh manual as select a/3 as q from facts") + exec("set div_precision_increment=0") + exec("refresh materialized view precision_4") + require.Equal(t, "0.3333333333", scalar("select q from precision_4")) + require.NotEqual(t, old, scalar("select rel_id from mo_catalog.mo_tables where reldatabase='"+schema+"' and relname='precision_4'")) + inventory, err := conn.QueryContext(ctx, "show table_number from mo_catalog") + require.NoError(t, err) + func() { + defer inventory.Close() + require.True(t, inventory.Next()) + var count int + require.NoError(t, inventory.Scan(&count)) + require.Equal(t, 65, count, "main's 61 catalogs plus the four MV catalogs") + require.False(t, inventory.Next()) + require.NoError(t, inventory.Err()) + }() + + }) +} + +// The existing database/sql types share this small interface; statements have a +// different call shape and are checked directly above. +type sqlQuerier interface { + QueryContext(context.Context, string, ...any) (*sql.Rows, error) +} diff --git a/pkg/util/executor/options.go b/pkg/util/executor/options.go index 4018a93385aee..27ea0066a7a35 100644 --- a/pkg/util/executor/options.go +++ b/pkg/util/executor/options.go @@ -666,3 +666,10 @@ func (opts StatementOption) WithDisableLock() StatementOption { func (opts StatementOption) DisableLock() bool { return opts.disableLock } + +// WithParserSQLMode captures the authoring mode of persisted executable SQL. +func (opts Options) WithParserSQLMode(mode string) Options { + opts.parserSQLMode = mode + return opts +} +func (opts Options) ParserSQLMode() string { return opts.parserSQLMode } diff --git a/pkg/util/executor/types.go b/pkg/util/executor/types.go index d840412542436..4758a61d022d5 100644 --- a/pkg/util/executor/types.go +++ b/pkg/util/executor/types.go @@ -68,6 +68,7 @@ type Options struct { error_chan chan error sql string forceRebuildPlan bool + parserSQLMode string resolveVariableFunc func(varName string, isSystemVar, isGlobalVar bool) (interface{}, error) adjustTableExtraFunc func(*api.SchemaExtra) error keepTxnAlive bool diff --git a/proto/task.proto b/proto/task.proto index 612415586f9a0..47233ec1b27ad 100644 --- a/proto/task.proto +++ b/proto/task.proto @@ -90,6 +90,8 @@ option (gogoproto.protosizer_all) = true; InitCdcLosslessStart = 15; // CDC source patterns with lossless identifier encoding. InitCdcSourcePatternV1 = 16; + // Native materialized view reconciliation and fenced refresh tasks. + MaterializedView = 17; } // TaskMetadata is a task metadata abstraction that can be scheduled for execution at any CN node. diff --git a/test/distributed/cases/dml/select/sp_table.result b/test/distributed/cases/dml/select/sp_table.result index a2f5658739bff..0c99ceb9d423e 100644 --- a/test/distributed/cases/dml/select/sp_table.result +++ b/test/distributed/cases/dml/select/sp_table.result @@ -33,9 +33,13 @@ mo_index_update r mo_indexes r mo_iscp_log r mo_locks v +mo_materialized_views cluster mo_merge_settings r mo_mongodb_connections r mo_mongodb_tables r +mo_mv_account_state cluster +mo_mv_dependencies cluster +mo_mv_refresh_runs cluster mo_mysql_compatibility_mode r mo_partition_metadata r mo_partition_tables r diff --git a/test/distributed/cases/dml/show/database_statistics.result b/test/distributed/cases/dml/show/database_statistics.result index 75a36f6ce6cc3..bd3e70a5448a1 100644 --- a/test/distributed/cases/dml/show/database_statistics.result +++ b/test/distributed/cases/dml/show/database_statistics.result @@ -9,7 +9,7 @@ show table_number from mysql; 6 show table_number from mo_catalog; ➤ Number of tables in mo_catalog[-5,64,0] 𝄀 -61 +65 show table_number from system; [unknown result because it is related to issue#23182] use mo_task; @@ -350,7 +350,7 @@ show table_number from mysql; 6 show table_number from mo_catalog; ➤ Number of tables in mo_catalog[-5,64,0] 𝄀 -38 +42 show table_number from system_metrics; ➤ Number of tables in system_metrics[-5,64,0] 𝄀 11 diff --git a/test/distributed/cases/dml/show/show.result b/test/distributed/cases/dml/show/show.result index 077d910261666..b6b599051ec7f 100644 --- a/test/distributed/cases/dml/show/show.result +++ b/test/distributed/cases/dml/show/show.result @@ -285,9 +285,13 @@ mo_index_update 𝄀 mo_indexes 𝄀 mo_iscp_log 𝄀 mo_locks 𝄀 +mo_materialized_views 𝄀 mo_merge_settings 𝄀 mo_mongodb_connections 𝄀 mo_mongodb_tables 𝄀 +mo_mv_account_state 𝄀 +mo_mv_dependencies 𝄀 +mo_mv_refresh_runs 𝄀 mo_mysql_compatibility_mode 𝄀 mo_partition_metadata 𝄀 mo_partition_tables 𝄀 @@ -319,7 +323,7 @@ mo_view_dependencies 𝄀 mo_view_refresh show table_number from mo_catalog; ➤ Number of tables in mo_catalog[-5,64,0] 𝄀 -61 +65 show column_number from mo_database; ➤ Number of columns in mo_database[-5,64,0] 𝄀 9 diff --git a/test/distributed/cases/git4data/clone/clone_sys_db_table_to_new_db_table.result b/test/distributed/cases/git4data/clone/clone_sys_db_table_to_new_db_table.result index f40ec66cb0cde..737bcb71b49be 100644 --- a/test/distributed/cases/git4data/clone/clone_sys_db_table_to_new_db_table.result +++ b/test/distributed/cases/git4data/clone/clone_sys_db_table_to_new_db_table.result @@ -157,9 +157,13 @@ mo_index_update mo_indexes mo_iscp_log mo_locks +mo_materialized_views mo_merge_settings mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables @@ -228,9 +232,13 @@ mo_index_update mo_indexes mo_iscp_log mo_locks +mo_materialized_views mo_merge_settings mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables diff --git a/test/distributed/cases/mo_cloud/mo_cloud.result b/test/distributed/cases/mo_cloud/mo_cloud.result index 4de1d00cd829a..15f0ec01f6cc5 100644 --- a/test/distributed/cases/mo_cloud/mo_cloud.result +++ b/test/distributed/cases/mo_cloud/mo_cloud.result @@ -822,8 +822,12 @@ mo_catalog ¦ mo_iceberg_tables ¦ r ¦ accountadmin 𝄀 mo_catalog ¦ mo_increment_columns ¦ ¦ accountadmin 𝄀 mo_catalog ¦ mo_indexes ¦ r ¦ accountadmin 𝄀 mo_catalog ¦ mo_locks ¦ v ¦ accountadmin 𝄀 +mo_catalog ¦ mo_materialized_views ¦ cluster ¦ - 𝄀 mo_catalog ¦ mo_mongodb_connections ¦ r ¦ accountadmin 𝄀 mo_catalog ¦ mo_mongodb_tables ¦ r ¦ accountadmin 𝄀 +mo_catalog ¦ mo_mv_account_state ¦ cluster ¦ - 𝄀 +mo_catalog ¦ mo_mv_dependencies ¦ cluster ¦ - 𝄀 +mo_catalog ¦ mo_mv_refresh_runs ¦ cluster ¦ - 𝄀 mo_catalog ¦ mo_mysql_compatibility_mode ¦ r ¦ accountadmin 𝄀 mo_catalog ¦ mo_partition_metadata ¦ r ¦ accountadmin 𝄀 mo_catalog ¦ mo_partition_tables ¦ r ¦ accountadmin 𝄀 diff --git a/test/distributed/cases/snapshot/cluster/restore_cluster_table.result b/test/distributed/cases/snapshot/cluster/restore_cluster_table.result index 27711a9aa3f3f..244f78234f5c0 100644 --- a/test/distributed/cases/snapshot/cluster/restore_cluster_table.result +++ b/test/distributed/cases/snapshot/cluster/restore_cluster_table.result @@ -434,9 +434,13 @@ mo_index_update mo_indexes mo_iscp_log mo_locks +mo_materialized_views mo_merge_settings mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables @@ -566,9 +570,13 @@ mo_index_update mo_indexes mo_iscp_log mo_locks +mo_materialized_views mo_merge_settings mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables diff --git a/test/distributed/cases/snapshot/cluster_level_snapshot_restore_cluster.result b/test/distributed/cases/snapshot/cluster_level_snapshot_restore_cluster.result index f74eb980517e6..c09f662a62b4c 100644 --- a/test/distributed/cases/snapshot/cluster_level_snapshot_restore_cluster.result +++ b/test/distributed/cases/snapshot/cluster_level_snapshot_restore_cluster.result @@ -471,9 +471,13 @@ mo_index_update mo_indexes mo_iscp_log mo_locks +mo_materialized_views mo_merge_settings mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables @@ -619,9 +623,13 @@ mo_index_update mo_indexes mo_iscp_log mo_locks +mo_materialized_views mo_merge_settings mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables diff --git a/test/distributed/cases/tenant/privilege/create_user_default_role.result b/test/distributed/cases/tenant/privilege/create_user_default_role.result index ff608cc79276f..7f272e35d23cf 100644 --- a/test/distributed/cases/tenant/privilege/create_user_default_role.result +++ b/test/distributed/cases/tenant/privilege/create_user_default_role.result @@ -50,9 +50,13 @@ mo_index_update mo_indexes mo_iscp_log mo_locks +mo_materialized_views mo_merge_settings mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables diff --git a/test/distributed/cases/view/materialized_view.result b/test/distributed/cases/view/materialized_view.result new file mode 100644 index 0000000000000..996db27dfdb7a --- /dev/null +++ b/test/distributed/cases/view/materialized_view.result @@ -0,0 +1,114 @@ +drop database if exists mv_bvt; +create database mv_bvt; +use mv_bvt; +create table facts(id int primary key,k int,v bigint); +insert into facts values(1,1,10),(2,1,20),(3,2,null); +set experimental_materialized_view=0; +create materialized view totals refresh manual as select k,count(*) as n,sum(v) as s from facts group by facts.k; +not supported: enable experimental_materialized_view before creating a materialized view +set experimental_materialized_view=1; +create materialized view totals refresh manual as select k,count(*) as n,sum(v) as s from facts group by facts.k; +select * from totals order by k; +invalid input: MV_NOT_POPULATED: refresh materialized view before querying it +refresh materialized view totals; +select k,n,s from totals order by k; +➤ k[4,32,0] ¦ n[-5,64,0] ¦ s[3,38,0] 𝄀 +1 ¦ 2 ¦ 30 𝄀 +2 ¦ 1 ¦ null +insert into facts values(4,2,7); +update facts set v=11 where id=1; +delete from facts where id=2; +select k,n,s from totals order by k; +➤ k[4,32,0] ¦ n[-5,64,0] ¦ s[3,38,0] 𝄀 +1 ¦ 2 ¦ 30 𝄀 +2 ¦ 1 ¦ null +refresh materialized view totals; +select k,n,s from totals order by k; +➤ k[4,32,0] ¦ n[-5,64,0] ¦ s[3,38,0] 𝄀 +1 ¦ 1 ¦ 11 𝄀 +2 ¦ 2 ¦ 7 +refresh materialized view totals; +select k,n,s from totals order by k; +➤ k[4,32,0] ¦ n[-5,64,0] ¦ s[3,38,0] 𝄀 +1 ¦ 1 ¦ 11 𝄀 +2 ¦ 2 ¦ 7 +create materialized view if not exists totals refresh manual as select id from facts; +select k,n,s from totals order by k; +➤ k[4,32,0] ¦ n[-5,64,0] ¦ s[3,38,0] 𝄀 +1 ¦ 1 ¦ 11 𝄀 +2 ¦ 2 ¦ 7 +show create materialized view totals; +➤ Materialized View[12,0,0] ¦ Create Materialized View[12,0,0] 𝄀 +totals ¦ create materialized view `mv_bvt`.`totals` refresh manual as select `facts`.`k` as `k`, count(*) as `n`, sum(`facts`.`v`) as `s` from `facts` group by `facts`.`k` +insert into totals(k) values(9); +invalid input: materialized view is read only +update totals set s=0; +invalid input: materialized view is read only +delete from totals; +invalid input: materialized view is read only +truncate table totals; +invalid input: materialized view is read only; use DROP/ALTER MATERIALIZED VIEW +drop table totals; +invalid input: materialized view is read only; use DROP/ALTER MATERIALIZED VIEW +alter table totals add column extra int; +invalid input: materialized view is read only; use DROP/ALTER MATERIALIZED VIEW +alter table totals add column (batch_x int,batch_y varchar(8)); +invalid input: materialized view is read only; use DROP/ALTER MATERIALIZED VIEW +alter table facts add column extra int; +invalid input: source has dependent materialized views; drop them before changing its schema/identity +alter table facts add column (batch_x int,batch_y varchar(8)); +invalid input: source has dependent materialized views; drop them before changing its schema/identity +truncate table facts; +invalid input: source has dependent materialized views; drop them before changing its schema/identity +drop table facts; +invalid input: source has dependent materialized views; drop them before changing its schema/identity +drop database mv_bvt; +invalid input: database contains materialized views; drop them first +select database(); +➤ database()[12,65535,0] 𝄀 +mv_bvt +select k,n,s from totals order by k; +➤ k[4,32,0] ¦ n[-5,64,0] ¦ s[3,38,0] 𝄀 +1 ¦ 1 ¦ 11 𝄀 +2 ¦ 2 ¦ 7 +select id,k,v from facts order by id; +➤ id[4,32,0] ¦ k[4,32,0] ¦ v[-5,64,0] 𝄀 +1 ¦ 1 ¦ 11 𝄀 +3 ¦ 2 ¦ null 𝄀 +4 ¦ 2 ¦ 7 +begin; +refresh materialized view totals; +internal error: unclassified statement appears in uncommitted transaction +rollback; +create materialized view unsupported refresh manual as select rand() from facts; +not supported: materialized view function rand +create materialized view unsupported refresh manual as select distinct k from facts; +not supported: materialized view query shape +create materialized view unsupported refresh manual as select * from totals; +not supported: materialized view sources must be persistent native tables +create materialized view unsupported refresh every interval 1 second as select * from facts; +invalid input: materialized view refresh interval must be at least 60 seconds +show tables; +➤ Tables_in_mv_bvt[12,5000,0] 𝄀 +facts 𝄀 +totals +alter materialized view totals refresh every interval 1 minute; +show create materialized view totals; +➤ Materialized View[12,0,0] ¦ Create Materialized View[12,0,0] 𝄀 +totals ¦ create materialized view `mv_bvt`.`totals` refresh every interval 60 second as select `facts`.`k` as `k`, count(*) as `n`, sum(`facts`.`v`) as `s` from `facts` group by `facts`.`k` +alter materialized view totals refresh manual; +show create materialized view totals; +➤ Materialized View[12,0,0] ¦ Create Materialized View[12,0,0] 𝄀 +totals ¦ create materialized view `mv_bvt`.`totals` refresh manual as select `facts`.`k` as `k`, count(*) as `n`, sum(`facts`.`v`) as `s` from `facts` group by `facts`.`k` +drop materialized view totals; +drop materialized view if exists totals; +alter table facts add column extra int; +alter table facts add column (batch_x int,batch_y varchar(8)); +select id,k,v,extra,batch_x,batch_y from facts order by id; +➤ id[4,32,0] ¦ k[4,32,0] ¦ v[-5,64,0] ¦ extra[4,32,0] ¦ batch_x[4,32,0] ¦ batch_y[12,8,0] 𝄀 +1 ¦ 1 ¦ 11 ¦ null ¦ null ¦ null 𝄀 +3 ¦ 2 ¦ null ¦ null ¦ null ¦ null 𝄀 +4 ¦ 2 ¦ 7 ¦ null ¦ null ¦ null +drop table facts; +drop database mv_bvt; +set experimental_materialized_view=0; diff --git a/test/distributed/cases/view/materialized_view.sql b/test/distributed/cases/view/materialized_view.sql new file mode 100644 index 0000000000000..f52fa0fe7d453 --- /dev/null +++ b/test/distributed/cases/view/materialized_view.sql @@ -0,0 +1,65 @@ +-- Native materialized views: deferred/manual publication and dependency guards. +drop database if exists mv_bvt; +create database mv_bvt; +use mv_bvt; +create table facts(id int primary key,k int,v bigint); +insert into facts values(1,1,10),(2,1,20),(3,2,null); +set experimental_materialized_view=0; +create materialized view totals refresh manual as select k,count(*) as n,sum(v) as s from facts group by facts.k; +set experimental_materialized_view=1; +-- Qualify the grouping key so SHOW CREATE is stable in both transaction modes. +create materialized view totals refresh manual as select k,count(*) as n,sum(v) as s from facts group by facts.k; +select * from totals order by k; +refresh materialized view totals; +select k,n,s from totals order by k; +insert into facts values(4,2,7); +update facts set v=11 where id=1; +delete from facts where id=2; +-- A source commit does not update the previous materialization. +select k,n,s from totals order by k; +refresh materialized view totals; +select k,n,s from totals order by k; +refresh materialized view totals; +select k,n,s from totals order by k; +-- IF NOT EXISTS preserves the existing definition and populated rows. +create materialized view if not exists totals refresh manual as select id from facts; +select k,n,s from totals order by k; +show create materialized view totals; +-- Writes and destructive source DDL must leave both relations intact. +insert into totals(k) values(9); +update totals set s=0; +delete from totals; +truncate table totals; +drop table totals; +alter table totals add column extra int; +alter table totals add column (batch_x int,batch_y varchar(8)); +alter table facts add column extra int; +alter table facts add column (batch_x int,batch_y varchar(8)); +truncate table facts; +drop table facts; +drop database mv_bvt; +select database(); +select k,n,s from totals order by k; +select id,k,v from facts order by id; +begin; +refresh materialized view totals; +rollback; +-- Unsupported definitions must not create a relation. +create materialized view unsupported refresh manual as select rand() from facts; +create materialized view unsupported refresh manual as select distinct k from facts; +create materialized view unsupported refresh manual as select * from totals; +create materialized view unsupported refresh every interval 1 second as select * from facts; +show tables; +alter materialized view totals refresh every interval 1 minute; +show create materialized view totals; +alter materialized view totals refresh manual; +show create materialized view totals; +drop materialized view totals; +drop materialized view if exists totals; +-- Removing the dependency permits ordinary source DDL again. +alter table facts add column extra int; +alter table facts add column (batch_x int,batch_y varchar(8)); +select id,k,v,extra,batch_x,batch_y from facts order by id; +drop table facts; +drop database mv_bvt; +set experimental_materialized_view=0; diff --git a/test/distributed/cases/zz_accesscontrol/create_account.result b/test/distributed/cases/zz_accesscontrol/create_account.result index ed41c82811128..945628fedb67e 100644 --- a/test/distributed/cases/zz_accesscontrol/create_account.result +++ b/test/distributed/cases/zz_accesscontrol/create_account.result @@ -180,8 +180,12 @@ mo_iceberg_residency_policy mo_iceberg_tables mo_indexes mo_locks +mo_materialized_views mo_mongodb_connections mo_mongodb_tables +mo_mv_account_state +mo_mv_dependencies +mo_mv_refresh_runs mo_mysql_compatibility_mode mo_partition_metadata mo_partition_tables diff --git a/test/materialized_view/README.md b/test/materialized_view/README.md new file mode 100644 index 0000000000000..50ef1e153035a --- /dev/null +++ b/test/materialized_view/README.md @@ -0,0 +1,154 @@ +# Experimental materialized-view validation + +The implementation is disabled by default. On 2026-10-13, the isolated local +cluster passed 66 main SQL checks, 3 restart checks, 5 native failure/cleanup +checks and 9 two-CN checks. Read `docs/design/materialized_view_results.md` for +results and scope. + +Build the harness from the repository with the Go version specified in go.mod: + +```bash +go build -mod=readonly -o /workspace/mv-build/mv-validation ./test/materialized_view +/workspace/mv-build/mv-validation -rows 1000000 -keep +``` + +The DSN defaults to the local development cluster, `dump:111` at +`127.0.0.1:6001`. Override it with `-dsn`. Use an isolated cluster: the harness +owns the `mv_validation` database, two `mv_validation_*` accounts, and test roles. +It removes prior fixture tables before starting. Do not use it on a shared or +production cluster. Every run writes its passed checks, errors and timings to +`-output` (default `/workspace/mv-build/sql-results.json`). A failure exits nonzero. + +The harness covers manual/deferred and scheduled refresh, independent exact +numeric/NULL oracles, joins and dimension changes, empty aggregates, repeated +refresh, read-only/dependency guards, unsupported query shapes, SQL mode and +fixed-offset timezone capture, prepared SELECT, source privilege revocation, +owner checks, concurrent readers/publishers, and same-name tenant isolation. + +The validation deployment's binary, configs and data are retained locally under +`/workspace/mv-build`. After validation, its task-owned service processes are +stopped. Start the primary deployment in a separate terminal when reproducing: + +```bash +env LD_LIBRARY_PATH=/workspace/matrixone/lib:/workspace/matrixone/cgo:/workspace/matrixone/thirdparties/install/lib \ + MO_JIEBA_DICT_DIR=/workspace/matrixone/dict OMP_NUM_THREADS=4 \ + /workspace/mv-build/mo-service -launch /workspace/mv-build/etc/launch.toml +``` + +For the second CN, use the same environment with +`/workspace/mv-build/mo-service -cfg /workspace/mv-build/etc/cn2.toml`. +These are local validation artifacts, not deployment templates. + +After a successful `-keep` run, stop and restart the same service with the same +isolated data directory, then run: + +```bash +/workspace/mv-build/mv-validation -restart-check \ + -output /workspace/mv-build/restart-results.json +``` + +The main benchmark uses deterministic integer data (`generate_series`, no random +seed), 1 million source rows, and 128 groups. It verifies full result equality, +records EXPLAIN output and refresh time, warms both queries, and retains 50 +alternating paired samples with the median ratio. It retrieves all rows. This +measures an explicit MV query; automatic rewrite is a later stage. It does not +claim cold-cache, multi-CN, or production latency results. + +Unit and failure-injection tests live beside their owning Go packages. They +cover the transaction-bound capability, source identity/schema fencing, +publication failure, snapshot drift, stale epoch/task replay, lost commit +response, optimistic retry, bounded admission, writer budget, captured timezone, +and reconciliation identity. See `docs/design/materialized_view_validation.md` +for executed evidence and remaining stage-specific cases. + +Run native failure rollback and dependency cleanup independently: + +```bash +/workspace/mv-build/mv-validation -edge-check \ + -output /workspace/mv-build/edge-results.json +``` + +The companion performance cases include explicit rollup, repeated join and a +high-cardinality control. All observations and EXPLAIN rows are saved in JSON. + +The failure mode owns `mv_validation_failure`; it does not delete a benchmark +fixture retained with `-keep`. After restart validation, explicitly drop the +retained `bench_mv`, `joined`, `empty_total`, and `totals` materialized views, +then drop `mv_validation`. + +### Automated BVT + +`optools/run_bvt_group.sh` runs the native contract suite once, after group 0's +mo-tester scripts finish. `optools/run_materialized_view_bvt.sh` reuses the two +existing Compose CNs, discovers their published SQL ports, and runs functional, +native rollback, and causal cross-CN modes. The functional mode uses the small +SQL fixtures and omits all performance experiments. Scheduled publication polls +the actual result with a 120-second outer deadline; its minimum supported period +is 60 seconds. No extra service is started. + +The Go runner is coverage-instrumented and writes into the same `coverage/` +directory as mo-service, so the existing BVT profile and required coverage merge +include both real server execution and client oracles. A failed mode or missing, +empty, or error-bearing JSON report fails the BVT step. To reuse local servers: + +```bash +MV_BVT_DSN='dump:111@tcp(127.0.0.1:6001)/?timeout=5s&readTimeout=330s&writeTimeout=330s' \ +MV_BVT_SECOND_DSN='dump:111@tcp(127.0.0.1:6002)/?timeout=5s&readTimeout=330s&writeTimeout=330s' \ + bash optools/run_materialized_view_bvt.sh "$PWD" /tmp/mv-bvt-report +``` + +`test/distributed/cases/view/materialized_view.sql` separately specifies the +deferred/manual SQL contract, unchanged stored rows before refresh, read-only and +dependency rejections, no replacement under IF NOT EXISTS, and schedule metadata. + +With two CN SQL endpoints sharing the same TN/LOG and storage, run the small +topology suite independently of the benchmark: + +```bash +/workspace/mv-build/mv-validation \ + -second-dsn 'dump:111@tcp(127.0.0.1:6002)/?timeout=5s&readTimeout=330s&writeTimeout=330s' \ + -output /workspace/mv-build/multi-cn-results.json +``` + +This mode owns and removes `mv_validation_multi_cn`, using four source rows. +It checks publication in both directions, five barrier-started concurrent +refresh rounds, stable relation identity, source snapshot progression and +terminal history. A concurrent w-w conflict is allowed; arbitrary errors are not. + +Publication verification on fresh main `3e50e1b32d8da61bbbf70c89989fb08b671809de` +uses protocol 112 and passed 84 SQL checks (67 main + 3 restart + 5 failure/drop + +9 two-CN). The extra case covers a backslash in a source identifier with captured +NO_BACKSLASH_ESCAPES. Prepared/authorized reads consume all rows and assert +terminal errors. The publication binary/config/data are retained under +`/workspace/mv-publish-artifacts`; use `runtime/etc/launch.toml` and the matching +native libraries in `/workspace/matrixone-mv-pr` when reproducing that build. +See the execution report for the distinct prototype/publication evidence. + + +For cross-CN checks, default MO Push mode permits an independently connected CN +to select an older applied snapshot. The harness uses `mo_ctl('cn','synccommit','')` +at cross-connection commit handoffs, then checks the complete published values +and exact unpopulated error. No timed sleep or repeated read is used. These +checks prove visibility after that causal handoff, not globally fresh reads in +the default asynchronous mode. Current integration reserves protocol 113 for MV +after main allocated 112 to WEEK/DAYOFYEAR; older protocol records above describe +their historical runs. + +Account lifecycle regressions are part of the normal `-functional` suite: +suspension/restriction preserve last-good rows/provenance, reopening resumes +refresh, ordinary database deletion restricts surviving MVs, and account deletion +retires populated/periodic MVs. A missing-target fault checks real rollback after +the first native MV drop; the fixture repairs its own catalog name afterward. +`-tenant-check` selects only these account scenarios for focused diagnosis. +The scheduler oracle waits for durable typed history and queue completion or +completed-task GC, so an old bounded retry cannot overwrite the next due-time +fixture. It uses the real reconciler, without adding task execution hooks. + +`-catalog-missing` is an opt-in kernel guard check for an isolated initialized +4.0.14 catalog with all four MV catalogs absent and `auto-upgrade=false`. Bootstrap +that catalog using the pre-feature binary. Standard login may reject this version +mismatch before DDL; a test-only `cn.frontend.skipCheckUser=true` session isolates +the compiler guard, with privilege checks still enabled. This scoped fixture is +not mixed-version or login-compatibility evidence. It never edits system schemas +and cleans its own database. Validate both transaction modes by configuring +`cn.txn.mode` to `pessimistic` or `optimistic` on that isolated CN. diff --git a/test/materialized_view/additional.go b/test/materialized_view/additional.go new file mode 100644 index 0000000000000..b7381407fd3b4 --- /dev/null +++ b/test/materialized_view/additional.go @@ -0,0 +1,596 @@ +// Copyright 2026 Matrix Origin +// Licensed under the Apache License, Version 2.0. +package main + +import ( + "context" + "database/sql" + "errors" + "fmt" + "math/big" + "os" + "reflect" + "sync" + "time" + + mysql "github.com/go-sql-driver/mysql" +) + +func typedAggregateOracle() { + actual := rows("select k,n,nv,s,lo,hi,av from totals order by k") + expected := [][]string{{"", "1", "1", "7", "7", "7", "7"}, {"1", "2", "2", "30", "10", "20", "15"}, {"2", "2", "1", "-2", "-2", "-2", "-2"}} + if len(actual) != len(expected) { + panic("typed oracle group count") + } + for i := range actual { + for j, value := range actual[i] { + want := expected[i][j] + if want == "" { + if value != want { + panic("typed oracle NULL") + } + continue + } + got, ok := new(big.Rat).SetString(value) + if !ok { + panic("invalid numeric aggregate") + } + target, _ := new(big.Rat).SetString(want) + if got.Cmp(target) != 0 { + panic(fmt.Sprintf("typed aggregate oracle group %d column %d", i, j)) + } + } + } + pass("independent typed aggregate oracle") +} + +func runAdditionalCases(dsn string) { + before := rows("select * from totals order by k") + exec("refresh materialized view totals") + exec("refresh materialized view totals") + if !reflect.DeepEqual(before, rows("select * from totals order by k")) { + panic("repeated refresh duplicated or changed rows") + } + pass("repeat refresh idempotent rows") + exec("create materialized view if not exists totals refresh manual as select * from facts") + if !reflect.DeepEqual(before, rows("select * from totals order by k")) { + panic("IF NOT EXISTS replaced existing definition") + } + pass("IF NOT EXISTS no replacement") + expectError("object kind collision", "create materialized view facts refresh manual as select * from dimension") + expectError("duplicate output heading", "create materialized view duplicate_names refresh manual as select k as x,v as x from facts") + expectError("minimum schedule interval", "create materialized view too_frequent refresh every interval 1 second as select * from facts") + expectError("MV nesting", "create materialized view nested refresh manual as select * from totals") + expectError("outer join", "create materialized view outer_join refresh manual as select * from facts f left join dimension d on f.k=d.k") + expectError("random sample", "create materialized view sampled refresh manual as select sample(k,1 rows) from facts") + exec("create temporary table temp_source(id int)") + expectError("temporary source", "create materialized view temporary_mv refresh manual as select * from temp_source") + exec("drop table temp_source") + exec("create materialized view grouped_empty refresh manual as select k,count(*) as n from facts where id<0 group by k") + exec("refresh materialized view grouped_empty") + if len(rows("select * from grouped_empty")) != 0 { + panic("grouped empty returned rows") + } + pass("grouped empty has zero rows") + exec("drop materialized view grouped_empty") + exec("create materialized view all_null refresh manual as select count(*) as n,count(v) as nv,sum(v) as s,avg(v) as av from facts where id=3") + exec("refresh materialized view all_null") + if !reflect.DeepEqual(rows("select n,nv,s,av from all_null"), [][]string{{"1", "0", "", ""}}) { + panic("all NULL aggregate oracle") + } + pass("all NULL typed oracle") + exec("drop materialized view all_null") + exec("create materialized view projected refresh manual as select id,k,v from facts where v>0") + exec("refresh materialized view projected") + equal("projection and filter", "select id,k,v from facts where v>0 order by id", "select * from projected order by id") + exec("drop materialized view projected") + exec("update dimension set label='ONE' where k=1") + exec("refresh materialized view joined") + equal("dimension mutation", "select d.label,sum(f.v),count(*) from facts f inner join dimension d on f.k=d.k group by d.label order by d.label", "select * from joined order by label") + exec("set sql_mode='PIPES_AS_CONCAT,NO_BACKSLASH_ESCAPES'") + exec("create materialized view mode_capture refresh manual as select id,'a' || 'b' as label from facts") + exec("set sql_mode=''") + exec("refresh materialized view mode_capture") + actual := rows("select label from mode_capture") + for _, row := range actual { + if row[0] != "ab" { + panic("captured SQL mode changed") + } + } + pass("captured SQL mode") + exec("drop materialized view mode_capture") + exec("set sql_mode='NO_BACKSLASH_ESCAPES'") + exec("create table `slash\\source`(v int)") + exec("insert into `slash\\source` values(17)") + exec("create materialized view escaped_source refresh manual as select v from `slash\\source`") + exec("set sql_mode=''") + exec("refresh materialized view escaped_source") + equal("captured context with escaped source identity", "select v from `slash\\source`", "select v from escaped_source") + exec("drop materialized view escaped_source") + exec("drop table `slash\\source`") + exec("set time_zone='+00:00'") + exec("create table tz_source(ts timestamp)") + exec("insert into tz_source values('2025-12-31 20:00:00')") + exec("set time_zone='+08:00'") + exec("create materialized view tz_mv refresh manual as select year(ts) as y from tz_source") + exec("set time_zone='+00:00'") + exec("refresh materialized view tz_mv") + if !reflect.DeepEqual(rows("select y from tz_mv"), [][]string{{"2026"}}) { + panic("fixed-offset authoring timezone was lost") + } + pass("captured fixed-offset timezone") + exec("drop materialized view tz_mv") + exec("drop table tz_source") + exec("begin") + expectError("create MV in user transaction", "create materialized view in_txn refresh manual as select * from facts") + exec("rollback") + expectError("rename dependent source", "alter table facts rename to renamed_facts") + expectError("foreign key into MV", "create table references_mv(k int,foreign key(k) references totals(k))") + stmt, err := db.PrepareContext(ctx, "select k,s,n from totals order by k") + if err != nil { + panic(err) + } + func() { + defer stmt.Close() + want := rows("select k,sum(v),count(*) from facts group by k order by k") + if !reflect.DeepEqual(preparedRows(stmt), want) { + panic("prepared read differs from base query before refresh") + } + exec("refresh materialized view totals") + if !reflect.DeepEqual(preparedRows(stmt), want) { + panic("prepared read differs from base query after refresh") + } + }() + pass("prepared read after refresh") + concurrencyCases(dsn) + privilegeCases(dsn) + tenantIsolationCases(dsn) +} + +func concurrencyCases(dsn string) { + config, err := mysql.ParseDSN(dsn) + if err != nil { + panic(err) + } + config.DBName = "mv_validation" + reader, err := openConfigured(config) + if err != nil { + panic(err) + } + defer reader.Close() + reader.SetMaxOpenConns(2) + exec("create table atomic_source(id int primary key,v int)") + exec("insert into atomic_source values(1,1),(2,1),(3,1),(4,1)") + exec("create materialized view atomic_mv refresh manual as select count(*) as n,sum(v) as s,min(v) as lo,max(v) as hi from atomic_source") + exec("refresh materialized view atomic_mv") + started := make(chan struct{}) + stop := make(chan struct{}) + failures := make(chan error, 1) + var wg sync.WaitGroup + wg.Go(func() { + close(started) + for { + select { + case <-stop: + return + default: + } + var n, s, lo, hi int64 + err := reader.QueryRowContext(ctx, "select n,s,lo,hi from atomic_mv").Scan(&n, &s, &lo, &hi) + if err != nil { + failures <- err + return + } + if n != 4 || lo != hi || s != 4*lo { + failures <- fmt.Errorf("reader observed partial or mixed publication: %d %d %d %d", n, s, lo, hi) + return + } + } + }) + <-started + for version := 2; version <= 6; version++ { + exec(fmt.Sprintf("update atomic_source set v=%d", version)) + exec("refresh materialized view atomic_mv") + } + close(stop) + wg.Wait() + select { + case err := <-failures: + panic(err) + default: + } + pass("concurrent readers see complete publications") + // Separate connections issue refresh at once; conflicts can be rejected, but + // the final committed view must still match a complete source snapshot. + start := make(chan struct{}) + errs := make(chan error, 2) + for i := 0; i < 2; i++ { + wg.Go(func() { <-start; _, err := reader.ExecContext(ctx, "refresh materialized view atomic_mv"); errs <- err }) + } + close(start) + wg.Wait() + close(errs) + successes := 0 + for err := range errs { + if err == nil { + successes++ + } + } + if successes == 0 { + panic("both concurrent refreshes failed") + } + equal("concurrent refresh publication", "select count(*),sum(v),min(v),max(v) from atomic_source", "select * from atomic_mv") + exec("drop materialized view atomic_mv") + exec("drop table atomic_source") +} + +func privilegeCases(dsn string) { + exec("create role mv_validation_reader") + defer exec("drop role mv_validation_reader") + exec("create user mv_validation_user identified by 'mv-validation-only'") + defer exec("drop user mv_validation_user") + exec("grant select on table mv_validation.totals to mv_validation_reader") + exec("grant mv_validation_reader to mv_validation_user") + config, err := mysql.ParseDSN(dsn) + if err != nil { + panic(err) + } + config.User = "sys:mv_validation_user:mv_validation_reader" + config.Passwd = "mv-validation-only" + config.DBName = "mv_validation" + restricted, err := openConfigured(config) + if err != nil { + panic(err) + } + defer restricted.Close() + restricted.SetMaxOpenConns(1) + if err = restricted.PingContext(ctx); err != nil { + panic(err) + } + if _, err = restricted.ExecContext(ctx, "select * from totals"); err == nil { + panic("MV grant alone bypassed source privilege") + } + pass("MV grant requires source SELECT") + exec("grant select on table mv_validation.facts to mv_validation_reader") + want := rows("select * from totals order by k") + if !reflect.DeepEqual(queryRows(restricted, "select * from totals order by k"), want) { + panic("authorized read differs from owner read") + } + pass("MV plus source grant permits read") + prepared, err := restricted.PrepareContext(ctx, "select * from totals order by k") + if err != nil { + panic(err) + } + defer prepared.Close() + if !reflect.DeepEqual(preparedRows(prepared), want) { + panic("authorized prepared read differs from owner read") + } + exec("revoke select on table mv_validation.facts from mv_validation_reader") + r, err := prepared.QueryContext(ctx) + if err == nil { + defer r.Close() + if len(decodeRows(r)) != 0 { + panic("prepared read exposed rows after source ACL revocation") + } + err = r.Err() + } + requireServerRejection("prepared source ACL revocation", err) + pass("prepared source ACL revocation") + if _, err = restricted.ExecContext(ctx, "refresh materialized view totals"); err == nil { + panic("nonowner refreshed MV") + } + pass("nonowner refresh rejected") + if _, err = restricted.ExecContext(ctx, "drop materialized view totals"); err == nil { + panic("nonowner dropped MV") + } + pass("nonowner drop rejected") + result, err := restricted.QueryContext(ctx, "show materialized views") + if err != nil { + panic(err) + } + defer result.Close() + if result.Next() { + panic("SHOW exposed another owner's definitions") + } + if err = result.Err(); err != nil { + panic(err) + } + pass("SHOW owner isolation") +} + +// runRestartCheck verifies persisted objects without modifying their sources. +// Use with main's -keep flag and restart the service between the two invocations. +func runRestartCheck() { + exec("use mv_validation") + equal("restart persisted materialization", "select k,sum(v),count(*) from bench group by k order by k", "select k,s,n from bench_mv order by k") + if len(rows("show materialized view refreshes bench_mv")) == 0 { + panic("history lost on restart") + } + pass("restart persisted history") + exec("refresh materialized view bench_mv") + pass("refresh after restart") +} + +// Keep imports/context checks explicit for the test harness's cancellation mode. +func timeoutRead(dsn string) { + config, err := mysql.ParseDSN(dsn) + if err != nil { + panic(err) + } + config.DBName = "mv_validation" + probe, err := openConfigured(config) + if err != nil { + panic(err) + } + defer probe.Close() + cancelled, cancel := context.WithCancel(context.Background()) + cancel() + r, err := probe.QueryContext(cancelled, "select * from totals") + if err == nil { + defer r.Close() + decodeRows(r) + err = r.Err() + } + if !errors.Is(err, context.Canceled) { + panic("cancelled query did not terminate") + } + pass("cancelled client read") +} + +func tenantIsolationCases(dsn string) { + for _, name := range []string{"mv_validation_a", "mv_validation_b"} { + exec("create account " + name + " admin_name='admin' identified by 'mv-validation-only'") + } + defer func() { + for _, name := range []string{"mv_validation_a", "mv_validation_b"} { + if _, err := db.ExecContext(ctx, "drop account if exists "+name); err != nil { + fmt.Fprintln(os.Stderr, "tenant cleanup:", err) + } + } + }() + tenants := make([]*sql.DB, 0, 2) + for i, name := range []string{"mv_validation_a", "mv_validation_b"} { + cfg, err := mysql.ParseDSN(dsn) + if err != nil { + panic(err) + } + cfg.User = name + ":admin" + cfg.Passwd = "mv-validation-only" + cfg.DBName = "" + connection, err := openConfigured(cfg) + if err != nil { + panic(err) + } + defer connection.Close() + connection.SetMaxOpenConns(1) + for _, q := range []string{"create database mv_validation", "use mv_validation", "set experimental_materialized_view=1", "create table facts(k int,v int)", fmt.Sprintf("insert into facts values(1,%d)", (i+1)*10), "create materialized view totals refresh manual as select k,sum(v) as s from facts group by k", "refresh materialized view totals"} { + if _, err = connection.ExecContext(ctx, q); err != nil { + panic(fmt.Errorf("tenant %s: %w", name, err)) + } + } + tenants = append(tenants, connection) + } + for i, connection := range tenants { + var amount int + if err := connection.QueryRowContext(ctx, "select s from totals").Scan(&amount); err != nil { + panic(err) + } + if amount != (i+1)*10 { + panic("tenant materialization crossed accounts") + } + if _, err := connection.ExecContext(ctx, "drop database mv_validation"); err == nil { + panic("DROP DATABASE bypassed surviving MV restriction") + } else { + requireServerRejection("tenant DROP DATABASE RESTRICT", err) + } + if _, err := connection.ExecContext(ctx, "create materialized view periodic refresh every interval 1 minute as select k,sum(v) as s from facts group by k"); err != nil { + panic(err) + } + if _, err := connection.ExecContext(ctx, "refresh materialized view periodic"); err != nil { + panic(err) + } + } + scheduledAccountLifecycleCases("mv_validation_a", dsn) + pass("same-name multi-tenant source and MV isolation") + pass("tenant DROP DATABASE restricts surviving MVs") + // Surviving manual/populated and periodic MVs are intentionally retained. + // Administrative deletion must retire them; explicit DROP MV masks the bug. + for _, name := range []string{"mv_validation_a", "mv_validation_b"} { + account := rows("select account_id from mo_catalog.mo_account where account_name='" + name + "'")[0][0] + if name == "mv_validation_a" { + accountRetirementRollbackCase(name, account, dsn) + } + exec("drop account " + name) + for _, table := range []string{"mo_materialized_views", "mo_mv_dependencies", "mo_mv_refresh_runs", "mo_mv_account_state"} { + if rows("select count(*) from mo_catalog." + table + " where account_id=" + account)[0][0] != "0" { + panic("DROP ACCOUNT leaked " + table) + } + } + if rows("select count(*) from mo_catalog.mo_tables where account_id=" + account)[0][0] != "0" { + panic("DROP ACCOUNT leaked native objects") + } + if rows("select count(*) from mo_task.sys_async_task where task_metadata_executor=17 and json_extract(cast(task_metadata_context as varchar),'$.Key.Account')=" + account)[0][0] != "0" { + panic("DROP ACCOUNT leaked queued MV tasks") + } + } + pass("DROP ACCOUNT retires surviving populated and periodic MVs") +} + +// NewConnector preserves account:user:role usernames; reparsing FormatDSN +// would interpret their first colon as the password separator. +func openConfigured(cfg *mysql.Config) (*sql.DB, error) { + connector, err := mysql.NewConnector(cfg) + if err != nil { + return nil, err + } + return sql.OpenDB(connector), nil +} + +func runNativeFailureAndCleanup() { + // Own this fixture independently of the benchmark/restart deployment. + exec("create database if not exists mv_validation_failure") + exec("use mv_validation_failure") + exec("set experimental_materialized_view=1") + exec("drop materialized view if exists failure_mv") + exec("drop table if exists failure_source") + exec("create table failure_source(id int,v bigint)") + exec("insert into failure_source values(1,0)") + exec("create materialized view failure_mv refresh manual as select id,v+9223372036854775807 as v from failure_source") + exec("refresh materialized view failure_mv") + old := rows("select * from failure_mv") + exec("update failure_source set v=1") + expectError("native source-expression refresh failure", "refresh materialized view failure_mv") + if !reflect.DeepEqual(old, rows("select * from failure_mv")) { + panic("failed native refresh changed last-good result") + } + pass("native failed refresh preserves rows") + runs := rows("show materialized view refreshes failure_mv") + if len(runs) < 2 || runs[0][1] != "FAILED" { + panic("native failed refresh history missing") + } + pass("native failed refresh diagnostic") + exec("drop materialized view failure_mv") + if len(rows("show materialized views")) != 0 { + panic("drop left MV metadata") + } + pass("drop removes MV state") + exec("drop database mv_validation_failure") + pass("dependency cleanup permits database drop") +} + +// Make the real reconciler due immediately and poll its durable terminal +// refresh history, rather than waiting through several full policy intervals; +// source rows and last-good metadata are the independent public oracles. +func scheduledAccountLifecycleCases(name string, dsn string) { + account := rows("select account_id from mo_catalog.mo_account where account_name='" + name + "'")[0][0] + definition := rows("select mv_id,epoch from mo_catalog.mo_materialized_views where account_id=" + account + " and name='periodic'")[0] + exec("update mo_catalog.mo_materialized_views set next_due=date_add(current_timestamp(),interval 1 day) where account_id=" + account + " and name='periodic'") + cfg, err := mysql.ParseDSN(dsn) + if err != nil { + panic(err) + } + cfg.User = name + ":admin" + cfg.Passwd = "mv-validation-only" + cfg.DBName = "mv_validation" + for _, status := range []string{"suspend", "restricted"} { + func() { + // Own a fresh session for each status transition; suspension kills it. + active, err := openConfigured(cfg) + if err != nil { + panic(err) + } + defer active.Close() + active.SetMaxOpenConns(1) + before := rows("select successful_sequence,last_run,source_physical,source_logical from mo_catalog.mo_materialized_views where account_id=" + account + " and name='periodic'") + oldRows := queryRows(active, "select * from periodic order by k") + if _, err := active.ExecContext(ctx, "update facts set v=v+1"); err != nil { + panic(err) + } + exec("alter account " + name + " " + status) + awaitScheduledMaterializedViewTask(account, definition, false) + after := rows("select successful_sequence,last_run,source_physical,source_logical from mo_catalog.mo_materialized_views where account_id=" + account + " and name='periodic'") + if !reflect.DeepEqual(before, after) { + panic(status + " account published MV metadata") + } + exec("alter account " + name + " open") + recovered, err := openConfigured(cfg) + if err != nil { + panic(err) + } + defer recovered.Close() + recovered.SetMaxOpenConns(1) + if !reflect.DeepEqual(oldRows, queryRows(recovered, "select * from periodic order by k")) { + panic(status + " account changed last-good rows") + } + pass("scheduled refresh blocked for " + status + " account preserves rows and provenance") + awaitScheduledMaterializedViewTask(account, definition, true) + if !reflect.DeepEqual(queryRows(recovered, "select k,sum(v) as s from facts group by k order by k"), queryRows(recovered, "select * from periodic order by k")) { + panic("reopened account refresh mismatch") + } + // Keep the normal reconciler away from the next status-boundary fixture. + exec("update mo_catalog.mo_materialized_views set next_due=date_add(current_timestamp(),interval 1 day) where account_id=" + account + " and name='periodic'") + pass("scheduled refresh resumes after reopening " + status + " account") + }() + } +} + +func awaitScheduledMaterializedViewTask(account string, definition []string, success bool) { + predicate := "account_id=" + account + " and mv_id=" + definition[0] + before := rows("select requested_sequence from mo_catalog.mo_materialized_views where " + predicate)[0][0] + // A system account may update its MV lifecycle catalog, but public sessions + // cannot insert internal mo_task rows. Let the real reconciler own dispatch. + exec("update mo_catalog.mo_materialized_views set next_due=current_timestamp() where " + predicate) + deadline := time.Now().Add(90 * time.Second) + for time.Now().Before(deadline) { + result := rows("select status,run_id from mo_catalog.mo_mv_refresh_runs where " + predicate + " and sequence>" + before + " order by sequence desc limit 1") + if len(result) == 1 && (result[0][0] == "SUCCEEDED" || result[0][0] == "FAILED") { + if len(result[0][1]) != 64 { + panic("scheduled run is not a typed task envelope") + } + queued := rows("select task_status from mo_task.sys_async_task where task_metadata_id='mv:" + result[0][1][:40] + "'") + // FAILED history precedes bounded retries. Await queue completion + // before changing account state. taskService.cleanupTasks deletes + // only Completed rows: terminal typed history plus an absent queue + // row also proves completion/GC in this exclusively owned fixture. + // A present Created/Running row is never treated as terminal. + if len(queued) > 1 { + panic("duplicate typed task queue identity") + } + if len(queued) == 1 && queued[0][0] != "2" { + select { + case <-ctx.Done(): + panic(ctx.Err()) + case <-time.After(200 * time.Millisecond): + } + continue + } + if (result[0][0] == "SUCCEEDED") != success { + panic(fmt.Sprintf("scheduled task expected success=%v got %v", success, result)) + } + return + } + select { + case <-ctx.Done(): + panic(ctx.Err()) + case <-time.After(200 * time.Millisecond): + } + } + panic(fmt.Sprintf("account-lifecycle task did not terminate; state=%v history=%v queue=%v", rows("select epoch,interval_seconds,next_due,requested_sequence,successful_sequence from mo_catalog.mo_materialized_views where "+predicate), rows("select status,run_id,sequence from mo_catalog.mo_mv_refresh_runs where "+predicate+" order by sequence desc limit 3"), rows("select task_metadata_id,task_status,result_code from mo_task.sys_async_task where task_metadata_executor=17 and json_extract(cast(task_metadata_context as varchar),'$.Key.Account')="+account))) +} + +// Corrupt only a task-owned retirement target name to force failure after the +// first MV has been dropped in the account transaction. This exercises real +// rollback without a product hook, sleeps or scheduler luck. +func accountRetirementRollbackCase(name, account, dsn string) { + cfg, err := mysql.ParseDSN(dsn) + if err != nil { + panic(err) + } + cfg.User = name + ":admin" + cfg.Passwd = "mv-validation-only" + cfg.DBName = "mv_validation" + connection, err := openConfigured(cfg) + if err != nil { + panic(err) + } + defer connection.Close() + connection.SetMaxOpenConns(1) + beforeRows := queryRows(connection, "select * from totals order by k") + beforePeriodic := queryRows(connection, "select * from periodic order by k") + exec("update mo_catalog.mo_materialized_views set name='retirement_missing' where account_id=" + account + " and name='periodic'") + defer exec("update mo_catalog.mo_materialized_views set name='periodic' where account_id=" + account + " and name='retirement_missing'") + query := "select mv_id,epoch,interval_seconds,next_due,successful_sequence,last_run from mo_catalog.mo_materialized_views where account_id=" + account + " order by mv_id" + before := rows(query) + _, err = db.ExecContext(ctx, "drop account "+name) + requireServerRejection("account retirement injected missing target", err) + if !reflect.DeepEqual(before, rows(query)) { + panic("failed account deletion changed MV policy/state") + } + if !reflect.DeepEqual(beforeRows, queryRows(connection, "select * from totals order by k")) || !reflect.DeepEqual(beforePeriodic, queryRows(connection, "select * from periodic order by k")) { + panic("failed account deletion lost native MV rows") + } + if rows("select count(*) from mo_catalog.mo_account where account_id=" + account)[0][0] != "1" { + panic("failed account deletion removed account") + } + pass("DROP ACCOUNT failure rolls back retired objects, policy and metadata") +} diff --git a/test/materialized_view/catalog.go b/test/materialized_view/catalog.go new file mode 100644 index 0000000000000..6578e090e561e --- /dev/null +++ b/test/materialized_view/catalog.go @@ -0,0 +1,47 @@ +// Copyright 2026 Matrix Origin +// Licensed under the Apache License, Version 2.0. +package main + +import ( + "fmt" + "os" +) + +// Use only an isolated, initialized pre-MV catalog with automatic upgrade off. +// If normal authentication rejects the old cluster at tenant-version admission, +// a test-only skipCheckUser session can isolate this kernel guard. It does not +// establish mixed-version/login compatibility; privilege checks remain enabled. +func runMissingMaterializedViewCatalog() { + if rows("select count(*) from mo_catalog.mo_tables where account_id=0 and reldatabase='mo_catalog' and relname in ('mo_materialized_views','mo_mv_dependencies','mo_mv_refresh_runs','mo_mv_account_state')")[0][0] != "0" { + panic("catalog-missing requires all four MV catalogs absent") + } + exec("set experimental_materialized_view=0") + exec("drop database if exists mv_validation_pre_migration") + exec("create database mv_validation_pre_migration") + defer func() { + original := recover() + _, err := db.ExecContext(ctx, "drop database if exists mv_validation_pre_migration") + if original != nil { + if err != nil { + fmt.Fprintln(os.Stderr, "fixture cleanup:", err) + } + panic(original) + } + if err != nil { + panic(err) + } + }() + exec("create table mv_validation_pre_migration.facts(id int primary key,v int)") + exec("insert into mv_validation_pre_migration.facts values(1,7)") + for _, item := range []struct{ name, sql string }{ + {"ordinary ALTER before MV migration", "alter table mv_validation_pre_migration.facts add column extra int"}, + {"ordinary CREATE INDEX before MV migration", "create index v_idx on mv_validation_pre_migration.facts(v)"}, + {"ordinary DROP INDEX before MV migration", "drop index v_idx on mv_validation_pre_migration.facts"}, + {"ordinary TRUNCATE before MV migration", "truncate table mv_validation_pre_migration.facts"}, + {"ordinary DROP TABLE before MV migration", "drop table mv_validation_pre_migration.facts"}, + {"ordinary DROP DATABASE before MV migration", "drop database mv_validation_pre_migration"}, + } { + exec(item.sql) + pass(item.name) + } +} diff --git a/test/materialized_view/main.go b/test/materialized_view/main.go new file mode 100644 index 0000000000000..46ab0b020c32a --- /dev/null +++ b/test/materialized_view/main.go @@ -0,0 +1,336 @@ +// Copyright 2026 Matrix Origin +// Licensed under the Apache License, Version 2.0. +// Runs independent SQL correctness checks and a paired warm-query benchmark. +package main + +import ( + "context" + "database/sql" + "encoding/json" + "errors" + "flag" + "fmt" + "os" + "reflect" + "sort" + "time" + + mysql "github.com/go-sql-driver/mysql" +) + +type report struct { + Experiments []pairedExperiment `json:"experiments"` + Started time.Time `json:"started"` + Cases []string `json:"passed_cases"` + Rows int `json:"source_rows"` + RefreshMS float64 `json:"refresh_ms"` + BaselineMS []float64 `json:"baseline_ms"` + MaterializedMS []float64 `json:"materialized_ms"` + Speedup float64 `json:"median_speedup"` + RawPlan [][]string `json:"raw_plan"` + MVPlan [][]string `json:"materialized_plan"` + MaterializedRows int `json:"materialized_rows"` + Error string `json:"error,omitempty"` +} + +var evidence report +var db *sql.DB +var ctx context.Context + +func exec(q string) { + if _, err := db.ExecContext(ctx, q); err != nil { + panic(fmt.Errorf("%s: %w", q, err)) + } +} +func rows(q string) [][]string { + return queryRows(db, q) +} +func queryRows(connection *sql.DB, q string) [][]string { + r, err := connection.QueryContext(ctx, q) + if err != nil { + panic(fmt.Errorf("%s: %w", q, err)) + } + defer r.Close() + out := decodeRows(r) + if err = r.Err(); err != nil { + panic(err) + } + return out +} +func preparedRows(stmt *sql.Stmt) [][]string { + r, err := stmt.QueryContext(ctx) + if err != nil { + panic(err) + } + defer r.Close() + out := decodeRows(r) + if err = r.Err(); err != nil { + panic(err) + } + return out +} + +// Callers own closing the result and checking its terminal stream error. +func decodeRows(r *sql.Rows) [][]string { + cols, err := r.Columns() + if err != nil { + panic(err) + } + out := make([][]string, 0) + for r.Next() { + values := make([]sql.RawBytes, len(cols)) + ptr := make([]any, len(cols)) + for i := range values { + ptr[i] = &values[i] + } + if err = r.Scan(ptr...); err != nil { + panic(err) + } + line := make([]string, len(cols)) + for i, v := range values { + if v == nil { + line[i] = "" + } else { + line[i] = string(v) + } + } + out = append(out, line) + } + return out +} +func expectError(name, q string) { + _, err := db.ExecContext(ctx, q) + requireServerRejection(name, err) + pass(name) +} +func requireServerRejection(name string, err error) { + if err == nil { + panic(name + ": expected rejection") + } + var serverError *mysql.MySQLError + if !errors.As(err, &serverError) || serverError.Number == 1046 { + panic(fmt.Errorf("%s: unexpected failure: %w", name, err)) + } +} +func equal(name, a, b string) { + if !reflect.DeepEqual(rows(a), rows(b)) { + panic(name + ": result mismatch") + } + pass(name) +} +func pass(name string) { evidence.Cases = append(evidence.Cases, name); fmt.Println("PASS", name) } +func measure(q string) float64 { + start := time.Now() + rows(q) + return float64(time.Since(start).Microseconds()) / 1000 +} +func median(a []float64) float64 { + b := append([]float64(nil), a...) + sort.Float64s(b) + if len(b)%2 == 0 { + return (b[len(b)/2-1] + b[len(b)/2]) / 2 + } + return b[len(b)/2] +} +func main() { + dsn := flag.String("dsn", "dump:111@tcp(127.0.0.1:6001)/?timeout=5s&readTimeout=330s&writeTimeout=330s", "isolated local cluster DSN") + output := flag.String("output", "/workspace/mv-build/sql-results.json", "evidence JSON") + n := flag.Int("rows", 1000000, "benchmark source rows") + catalogMissing := flag.Bool("catalog-missing", false, "isolated pre-MV kernel fixture only: validate ordinary DDL without catalogs") + tenantCheck := flag.Bool("tenant-check", false, "run isolated account lifecycle contracts only") + functional := flag.Bool("functional", false, "run SQL contracts without performance experiments") + keep := flag.Bool("keep", false, "retain test database for restart checks") + edge := flag.Bool("edge-check", false, "verify native failure rollback and clean retained fixtures") + restart := flag.Bool("restart-check", false, "check a retained database after restarting service") + scheduled := flag.Bool("scheduled", true, "verify background refresh (up to 120 seconds)") + secondDSN := flag.String("second-dsn", "", "run cross-CN checks using a second SQL endpoint instead of the main suite") + flag.Parse() + evidence.Started = time.Now().UTC() + evidence.Rows = *n + if *functional || *tenantCheck { + evidence.Rows = 0 // No generated benchmark source is created in this mode. + } + defer func() { + if failure := recover(); failure != nil { + evidence.Error = fmt.Sprint(failure) + } + data, _ := json.MarshalIndent(evidence, "", " ") + if err := os.WriteFile(*output, data, 0644); err != nil { + fmt.Fprintln(os.Stderr, err) + } + if evidence.Error != "" { + fmt.Fprintln(os.Stderr, evidence.Error) + os.Exit(1) + } + }() + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(context.Background(), 15*time.Minute) + defer cancel() + var err error + db, err = sql.Open("mysql", *dsn) + if err != nil { + panic(err) + } + defer db.Close() + db.SetMaxOpenConns(4) + if err = db.PingContext(ctx); err != nil { + panic(err) + } + if *catalogMissing { + evidence.Rows = 0 + runMissingMaterializedViewCatalog() + return + } + if *tenantCheck { + tenantIsolationCases(*dsn) + return + } + if *secondDSN != "" { + runMultiCN(*secondDSN) + return + } + if *edge { + runNativeFailureAndCleanup() + return + } + if *restart { + runRestartCheck() + return + } + exec("create database if not exists mv_validation") + exec("use mv_validation") + // Pin one connection because USE and session variables are session-local. + db.SetMaxOpenConns(1) + for _, name := range []string{"bench_mv", "joined", "empty_total", "totals", "unsupported", "gated", "escaped_source"} { + exec("drop materialized view if exists " + name) + } + exec("drop table if exists `slash\\source`") + for _, name := range []string{"facts", "dimension", "bench"} { + exec("drop table if exists " + name) + } + exec("set experimental_materialized_view=0") + exec("create table facts (id int primary key,k int,v decimal(18,2))") + exec("insert into facts values(1,1,10),(2,1,20),(3,2,null),(4,null,7),(5,2,-2)") + expectError("experimental gate", "create materialized view gated refresh manual as select * from facts") + exec("set experimental_materialized_view=1") + const aggregate = "select k,count(*) as n,count(v) as nv,sum(v) as s,min(v) as lo,max(v) as hi,avg(v) as av from facts group by k" + exec("create materialized view totals refresh manual as " + aggregate) + expectError("deferred population", "select * from totals") + exec("refresh materialized view totals") + equal("NULL and aggregate semantics", aggregate+" order by k", "select * from totals order by k") + typedAggregateOracle() + saved := rows("select * from totals order by k") + exec("insert into facts values(6,1,90),(7,3,12)") + exec("update facts set v=25 where id=1") + exec("delete from facts where id=2") + if !reflect.DeepEqual(saved, rows("select * from totals order by k")) { + panic("manual view changed before refresh") + } + pass("last committed materialization") + exec("refresh materialized view totals") + equal("insert update delete refresh", aggregate+" order by k", "select * from totals order by k") + for _, q := range []string{"insert into totals(k) values(4)", "update totals set k=4", "delete from totals", "truncate table totals", "replace into totals(k) values(4)", "alter table totals add x int", "drop table totals"} { + expectError("read only: "+q, q) + } + for _, q := range []string{"alter table facts add x int", "truncate table facts", "drop table facts", "drop database mv_validation"} { + expectError("dependency restrict: "+q, q) + } + if !reflect.DeepEqual(rows("select database()"), [][]string{{"mv_validation"}}) { + panic("failed dependency DROP changed current database") + } + pass("failed DROP preserves current database") + for _, source := range []string{"select rand() from facts", "select now() from facts", "select distinct k from facts", "select count(distinct k) from facts", "select * from facts limit 1", "select row_number() over(order by id) from facts", "select * from totals"} { + expectError("unsupported definition: "+source, "create materialized view unsupported refresh manual as "+source) + } + exec("create table dimension(k int primary key,label varchar(20))") + exec("insert into dimension values(1,'one'),(2,'two')") + const joined = "select d.label,sum(f.v) as s,count(*) as n from facts f inner join dimension d on f.k=d.k group by d.label" + exec("create materialized view joined refresh manual as " + joined) + exec("refresh materialized view joined") + equal("inner join refresh", joined+" order by label", "select * from joined order by label") + exec("create materialized view empty_total refresh manual as select count(*) as n,sum(v) as s from facts where id<0") + exec("refresh materialized view empty_total") + equal("empty aggregate", "select count(*),sum(v) from facts where id<0", "select * from empty_total") + exec("begin") + expectError("refresh in user transaction", "refresh materialized view totals") + exec("rollback") + exec("alter materialized view totals refresh every interval 1 minute") + creation := rows("show create materialized view totals") + if len(creation) != 1 { + panic("SHOW CREATE missing") + } + pass("SHOW CREATE") + if *scheduled { + exec("insert into facts values(8,4,123)") + deadline := time.Now().Add(120 * time.Second) + matched := false + for time.Now().Before(deadline) { + if reflect.DeepEqual(rows(aggregate+" order by k"), rows("select * from totals order by k")) { + matched = true + break + } + time.Sleep(2 * time.Second) + } + if !matched { + panic("scheduled refresh did not publish within 120 seconds") + } + pass("scheduled refresh") + } + exec("alter materialized view totals refresh manual") + state := rows("show materialized views") + if len(state) != 3 { + panic("SHOW list mismatch") + } + pass("SHOW state and full source timestamp") + history := rows("show materialized view refreshes totals") + if len(history) == 0 { + panic("missing refresh history") + } + pass("refresh history") + runAdditionalCases(*dsn) + timeoutRead(*dsn) + if *functional || *tenantCheck { + for _, name := range []string{"joined", "empty_total", "totals"} { + exec("drop materialized view " + name) + } + exec("drop database mv_validation") + pass("drop cleanup") + return + } + // Explicit view scan versus the same raw aggregation: P1 has no automatic rewrite. + exec("create table bench(id bigint,k int,v bigint)") + exec(fmt.Sprintf("insert into bench select result,result%%128,result%%1000 from generate_series(1,%d) g", *n)) + const baseline = "select k,sum(v) as s,count(*) as n from bench group by k" + const materialized = "select k,s,n from bench_mv" + exec("create materialized view bench_mv refresh manual as " + baseline) + start := time.Now() + exec("refresh materialized view bench_mv") + evidence.RefreshMS = float64(time.Since(start).Microseconds()) / 1000 + equal("benchmark result equality", baseline+" order by k", materialized+" order by k") + evidence.RawPlan = rows("explain " + baseline) + evidence.MVPlan = rows("explain " + materialized) + evidence.MaterializedRows = len(rows(materialized)) + rows(baseline) + rows(materialized) + for i := 0; i < 50; i++ { + if i%2 == 0 { + evidence.BaselineMS = append(evidence.BaselineMS, measure(baseline)) + evidence.MaterializedMS = append(evidence.MaterializedMS, measure(materialized)) + } else { + evidence.MaterializedMS = append(evidence.MaterializedMS, measure(materialized)) + evidence.BaselineMS = append(evidence.BaselineMS, measure(baseline)) + } + } + evidence.Speedup = median(evidence.BaselineMS) / median(evidence.MaterializedMS) + fmt.Printf("rows=%d refresh_ms=%.3f raw_median_ms=%.3f mv_median_ms=%.3f speedup=%.2fx\n", *n, evidence.RefreshMS, median(evidence.BaselineMS), median(evidence.MaterializedMS), evidence.Speedup) + performanceCases() + if *keep { + pass("retained restart fixture") + return + } + for _, name := range []string{"bench_mv", "joined", "empty_total", "totals"} { + exec("drop materialized view " + name) + } + exec("drop database mv_validation") + pass("drop cleanup") +} diff --git a/test/materialized_view/multi_cn.go b/test/materialized_view/multi_cn.go new file mode 100644 index 0000000000000..90ce5cb9ccb14 --- /dev/null +++ b/test/materialized_view/multi_cn.go @@ -0,0 +1,169 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package main + +import ( + "database/sql" + "errors" + "fmt" + "strings" + "sync" + + mysql "github.com/go-sql-driver/mysql" +) + +// The second CN shares the same TN and storage. No fixture from the benchmark +// is reused: the topology checks own a small, separate database. +func runMultiCN(secondDSN string) { + const database = "mv_validation_multi_cn" + evidence.Rows = 4 + db.SetMaxOpenConns(1) + exec("create database if not exists " + database) + exec("use " + database) + exec("set experimental_materialized_view=1") + exec("drop materialized view if exists atomic_mv") + exec("drop table if exists atomic_source") + defer func() { + exec("drop materialized view if exists atomic_mv") + exec("drop table if exists atomic_source") + exec("drop database " + database) + }() + exec("create table atomic_source(id int primary key,v bigint)") + exec("insert into atomic_source values(1,1),(2,1),(3,1),(4,1)") + exec("create materialized view atomic_mv refresh manual as select count(*) as n,sum(v) as s,min(v) as lo,max(v) as hi from atomic_source") + config, err := mysql.ParseDSN(secondDSN) + if err != nil { + panic(err) + } + config.DBName = database + other, err := openConfigured(config) + if err != nil { + panic(err) + } + defer other.Close() + other.SetMaxOpenConns(1) + if err = other.PingContext(ctx); err != nil { + panic(err) + } + // Push mode permits an independently connected CN to start at its older + // applied snapshot. Hand off the actual commit frontier before assertions + // spanning connections, using MO's existing bounded synchronization API. + // This is a causal barrier, not a timing assumption or a query retry. + syncCommits := func() { rows("select mo_ctl('cn','synccommit','')") } + syncCommits() + if _, err = other.ExecContext(ctx, "select * from atomic_mv"); err == nil { + panic("second CN accepted an unpopulated view") + } else { + var serverError *mysql.MySQLError + if !errors.As(err, &serverError) || serverError.Number != 20301 || !strings.Contains(serverError.Message, "MV_NOT_POPULATED") { + panic(fmt.Errorf("second CN population check: %w", err)) + } + } + pass("second CN rejects unpopulated view") + exec("refresh materialized view atomic_mv") + syncCommits() + read := func(connection *sql.DB) int64 { + var n, s, lo, hi int64 + if err := connection.QueryRowContext(ctx, "select n,s,lo,hi from atomic_mv").Scan(&n, &s, &lo, &hi); err != nil { + panic(err) + } + if n != 4 || lo != hi || s != 4*lo { + panic(fmt.Sprintf("partial cross-CN publication: %d %d %d %d", n, s, lo, hi)) + } + return lo + } + if read(other) != 1 { + panic("second CN did not see first publication") + } + pass("cross-CN publication visibility") + if _, err = other.ExecContext(ctx, "refresh materialized view atomic_mv"); err != nil { + panic(fmt.Errorf("standalone second-CN refresh: %w", err)) + } + syncCommits() + if read(db) != 1 { + panic("first CN did not see the second CN's publication") + } + pass("second CN can refresh independently") + var originalID uint64 + if err = db.QueryRowContext(ctx, "select rel_id from mo_catalog.mo_tables where reldatabase='"+database+"' and relname='atomic_mv'").Scan(&originalID); err != nil { + panic(err) + } + var previousPhysical int64 + var previousLogical uint32 + for version := int64(2); version <= 6; version++ { + publisher, reader := db, other + if version%2 == 1 { + publisher, reader = other, db + } + if _, err = publisher.ExecContext(ctx, fmt.Sprintf("update atomic_source set v=%d", version)); err != nil { + panic(err) + } + syncCommits() + start := make(chan struct{}) + results := make(chan error, 2) + var wg sync.WaitGroup + for _, connection := range []*sql.DB{db, other} { + wg.Go(func() { + <-start + _, refreshErr := connection.ExecContext(ctx, "refresh materialized view atomic_mv") + results <- refreshErr + }) + } + close(start) + wg.Wait() + close(results) + succeeded := 0 + for refreshErr := range results { + if refreshErr == nil { + succeeded++ + } else { + var serverError *mysql.MySQLError + if !errors.As(refreshErr, &serverError) || serverError.Number != 20619 { + panic(fmt.Errorf("unexpected cross-CN refresh failure: %w", refreshErr)) + } + fmt.Println("concurrent refresh rejected:", refreshErr) + } + } + syncCommits() + readerVersion, publisherVersion := read(reader), read(publisher) + if succeeded == 0 || readerVersion != version || publisherVersion != version { + panic(fmt.Sprintf("cross-CN refresh did not publish the latest complete fixture: expected=%d successful_requests=%d reader=%d publisher=%d metadata=%v history=%v", + version, succeeded, readerVersion, publisherVersion, + rows("select requested_sequence,successful_sequence,source_physical,source_logical from mo_catalog.mo_materialized_views where database_name='"+database+"' and name='atomic_mv'"), + rows("select sequence,status,source_physical,source_logical from mo_catalog.mo_mv_refresh_runs where mv_id=(select mv_id from mo_catalog.mo_materialized_views where database_name='"+database+"' and name='atomic_mv') order by sequence"))) + } + var id uint64 + var physical int64 + var logical uint32 + if err = reader.QueryRowContext(ctx, "select mv_id,source_physical,source_logical from mo_catalog.mo_materialized_views where database_name='"+database+"' and name='atomic_mv'").Scan(&id, &physical, &logical); err != nil { + panic(err) + } + if id != originalID || physical < previousPhysical || (physical == previousPhysical && logical < previousLogical) { + panic("cross-CN identity or source timestamp regressed") + } + previousPhysical, previousLogical = physical, logical + pass(fmt.Sprintf("two-CN concurrent publication version %d", version)) + } + var successes, pending int + if err = other.QueryRowContext(ctx, "select count(*) from mo_catalog.mo_mv_refresh_runs where mv_id=? and status='SUCCEEDED'", originalID).Scan(&successes); err != nil { + panic(err) + } + if err = other.QueryRowContext(ctx, "select count(*) from mo_catalog.mo_mv_refresh_runs where mv_id=? and status='RUNNING'", originalID).Scan(&pending); err != nil { + panic(err) + } + if successes < 7 || pending != 0 { + panic(fmt.Sprintf("cross-CN history not terminal: successful=%d pending=%d", successes, pending)) + } + pass("cross-CN terminal history") +} diff --git a/test/materialized_view/native_probe/check.py b/test/materialized_view/native_probe/check.py new file mode 100644 index 0000000000000..40bac42022ef7 --- /dev/null +++ b/test/materialized_view/native_probe/check.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +"""Exercise the recovery SQL bridge against an existing native BVT endpoint.""" + +import json +import pathlib +import subprocess +import sys + + +def check(binary, dsn): + def request(sql, query=True): + return json.dumps({"dsn": dsn, "sql": sql, "query": query}) + + statements = [ + "{", # Malformed JSON must not terminate the following requests. + json.dumps({"dsn": "invalid-dsn", "sql": "select 1", "query": True}), + request("select 1,cast(null as char),cast('bridge' as char) union all select 2,'value','tail'"), + request("set @mv_native_probe_value=23", query=False), + request("select @mv_native_probe_value"), + request("select 1 where false"), + request("select * from mo_catalog.__mv_native_probe_missing__"), + request("insert into mo_catalog.__mv_native_probe_missing__ values(1)", query=False), + request("select @mv_native_probe_value+1"), + ] + result = subprocess.run( + [binary], input="\n".join(statements) + "\n", text=True, + capture_output=True, timeout=90, + ) + if result.returncode: + raise RuntimeError("SQL bridge failed: " + result.stderr) + responses = [json.loads(line) for line in result.stdout.splitlines()] + assert len(responses) == len(statements), responses + assert responses[0]["error"].startswith("unexpected end of JSON input"), responses[0] + assert "invalid DSN" in responses[1]["error"], responses[1] + expected = { + 2: [["1", "", "bridge"], ["2", "value", "tail"]], + 3: None, + 4: [["23"]], # Same DSN reuses its session across Exec and Query. + 5: [], # Zero rows and SQL NULL remain distinct protocol values. + 8: [["24"]], # SQL errors must not poison the stream/session. + } + for index, rows in expected.items(): + assert responses[index] == {"rows": rows, "error": ""}, (index, responses[index]) + for index in (6, 7): + assert responses[index]["rows"] is None and "Error 1146" in responses[index]["error"], (index, responses[index]) + return {"passed_requests": len(responses), "process_exit": result.returncode} + + +if __name__ == "__main__": + if len(sys.argv) != 3: + raise SystemExit("Usage: check.py ") + # Two independent client lifetimes exercise the same native instance. Only + # connection-local state is changed; EOF closes the bridge's SQL resources. + print(json.dumps({"runs": [check(str(pathlib.Path(sys.argv[1]).resolve()), sys.argv[2]) for _ in range(2)]})) diff --git a/test/materialized_view/native_probe/main.go b/test/materialized_view/native_probe/main.go new file mode 100644 index 0000000000000..0b6f1a2e0b718 --- /dev/null +++ b/test/materialized_view/native_probe/main.go @@ -0,0 +1,103 @@ +// Copyright 2026 Matrix Origin +// Licensed under the Apache License, Version 2.0. + +// A small JSON-lines SQL client for the process-owning native recovery driver. +package main + +import ( + "bufio" + "context" + "database/sql" + "encoding/json" + "fmt" + "os" + "time" + + _ "github.com/go-sql-driver/mysql" +) + +type request struct { + DSN string `json:"dsn"` + SQL string `json:"sql"` + Query bool `json:"query"` +} + +func run(db *sql.DB, q request) ([][]string, error) { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + if !q.Query { + _, err := db.ExecContext(ctx, q.SQL) + return nil, err + } + r, err := db.QueryContext(ctx, q.SQL) + if err != nil { + return nil, err + } + defer r.Close() + cols, err := r.Columns() + if err != nil { + return nil, err + } + out := make([][]string, 0) + for r.Next() { + values := make([]sql.NullString, len(cols)) + ptrs := make([]any, len(cols)) + for i := range values { + ptrs[i] = &values[i] + } + if err = r.Scan(ptrs...); err != nil { + return nil, err + } + line := make([]string, len(cols)) + for i, v := range values { + line[i] = v.String + if !v.Valid { + line[i] = "" + } + } + out = append(out, line) + } + return out, r.Err() +} + +func main() { + dbs := map[string]*sql.DB{} + defer func() { + for _, db := range dbs { + db.Close() + } + }() + in := bufio.NewScanner(os.Stdin) + in.Buffer(make([]byte, 4096), 1<<20) + out := json.NewEncoder(os.Stdout) + for in.Scan() { + var q request + var data [][]string + err := json.Unmarshal(in.Bytes(), &q) + if err == nil { + connection := dbs[q.DSN] + if connection == nil { + connection, err = sql.Open("mysql", q.DSN) + if err == nil { + connection.SetMaxOpenConns(1) + dbs[q.DSN] = connection + } + } + if err == nil { + data, err = run(connection, q) + } + } + message := "" + if err != nil { + message = err.Error() + } + if err := out.Encode(map[string]any{"rows": data, "error": message}); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + } + if err := in.Err(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/test/materialized_view/performance.go b/test/materialized_view/performance.go new file mode 100644 index 0000000000000..30b3c366019c5 --- /dev/null +++ b/test/materialized_view/performance.go @@ -0,0 +1,57 @@ +// Copyright 2026 Matrix Origin +// Licensed under the Apache License, Version 2.0. +package main + +import ( + "fmt" + "time" +) + +type pairedExperiment struct { + Name string `json:"name"` + RefreshMS float64 `json:"refresh_ms"` + ResultRows int `json:"result_rows"` + RawMS, MVMS []float64 + Ratio float64 `json:"median_ratio"` +} + +func paired(name, raw, stored string, refreshMS float64) pairedExperiment { + equal(name+" result equality", raw+" order by 1", stored+" order by 1") + result := pairedExperiment{Name: name, RefreshMS: refreshMS, ResultRows: len(rows(stored))} + rows(raw) + rows(stored) + for i := 0; i < 50; i++ { + if i%2 == 0 { + result.RawMS = append(result.RawMS, measure(raw)) + result.MVMS = append(result.MVMS, measure(stored)) + } else { + result.MVMS = append(result.MVMS, measure(stored)) + result.RawMS = append(result.RawMS, measure(raw)) + } + } + result.Ratio = median(result.RawMS) / median(result.MVMS) + fmt.Printf("experiment=%s rows=%d raw_ms=%.3f mv_ms=%.3f ratio=%.2fx\n", name, result.ResultRows, median(result.RawMS), median(result.MVMS), result.Ratio) + return result +} +func performanceCases() { + // Explicit rollup uses mergeable SUM/COUNT, with an independent raw oracle. + evidence.Experiments = append(evidence.Experiments, paired("B02 explicit rollup", "select k div 16 as g,sum(v) as s,count(*) as n from bench group by k div 16", "select k div 16 as g,sum(s) as s,sum(n) as n from bench_mv group by k div 16", 0)) + exec("create table bench_dimension(k int primary key,label int)") + exec("insert into bench_dimension select result-1,(result-1)%8 from generate_series(1,128) g") + const joined = "select d.label,sum(b.v) as s,count(*) as n from bench b inner join bench_dimension d on b.k=d.k group by d.label" + exec("create materialized view bench_join_mv refresh manual as " + joined) + start := time.Now() + exec("refresh materialized view bench_join_mv") + elapsed := float64(time.Since(start).Microseconds()) / 1000 + evidence.Experiments = append(evidence.Experiments, paired("B03 repeated join", joined, "select label,s,n from bench_join_mv", elapsed)) + exec("drop materialized view bench_join_mv") + exec("drop table bench_dimension") + // A small, near-source-grain control exposes weak/no improvement and costs. + const granular = "select id,sum(v) as s,count(*) as n from bench where id<=10000 group by id" + exec("create materialized view bench_grain_mv refresh manual as " + granular) + start = time.Now() + exec("refresh materialized view bench_grain_mv") + elapsed = float64(time.Since(start).Microseconds()) / 1000 + evidence.Experiments = append(evidence.Experiments, paired("B05 high cardinality control", granular, "select id,s,n from bench_grain_mv", elapsed)) + exec("drop materialized view bench_grain_mv") +} From 4280e1f7c4c10f34804f3e1a9d484e2eabf65b13 Mon Sep 17 00:00:00 2001 From: dengn Date: Sun, 18 Oct 2026 20:31:14 +0800 Subject: [PATCH 2/5] fix(mv): guard native load, source deletes and DDL export Reject materialized views before native dump/load file admission, preserve source identity for unrestricted DELETE with matching index maintenance, and reconstruct SHOW CREATE TABLE using the authoritative MV formatter and policy. Add nine native consumer regressions to the existing BVT entrypoint, typed planner/load/formatter tests, and inspectable validation evidence. Related to matrixorigin/matrixone#30079. --- .../materialized_view_consumer_fixes.md | 84 ++++ .../materialized_view_consumer_results.json | 384 ++++++++++++++++++ docs/design/materialized_view_validation.md | 13 + optools/run_materialized_view_bvt.sh | 6 +- pkg/frontend/materialized_view.go | 6 +- pkg/frontend/table_dump.go | 2 +- pkg/frontend/table_dump_test.go | 4 +- pkg/mv/service.go | 10 + pkg/mv/service_test.go | 10 + pkg/sql/plan/build_dml_util.go | 35 +- pkg/sql/plan/build_show.go | 22 + pkg/sql/plan/materialized_view.go | 39 ++ pkg/sql/plan/materialized_view_delete_test.go | 122 ++++++ test/materialized_view/README.md | 12 + test/materialized_view/consumers.go | 155 +++++++ test/materialized_view/main.go | 6 + 16 files changed, 879 insertions(+), 31 deletions(-) create mode 100644 docs/design/materialized_view_consumer_fixes.md create mode 100644 docs/design/materialized_view_consumer_results.json create mode 100644 pkg/sql/plan/materialized_view_delete_test.go create mode 100644 test/materialized_view/consumers.go diff --git a/docs/design/materialized_view_consumer_fixes.md b/docs/design/materialized_view_consumer_fixes.md new file mode 100644 index 0000000000000..dce3a785e6ef3 --- /dev/null +++ b/docs/design/materialized_view_consumer_fixes.md @@ -0,0 +1,84 @@ +# MV native consumer corrections (review 5562448876) + +This focused follow-up is based on `79484a43c2a4c984b9cb9e0290805822d6d6a275`, +whose main CI and both connector workflows passed. It preserves that revision's +format-2 semantic context, migration4.0.17/offset5, protocol119, task executor17, +and existing transaction/task owners. It addresses the three public SQL defects +reproduced by review5562448876; no new feature design or allocation is introduced. + +## Requirements and ownership + +| Reproducer | Required behavior | First owner / correction | +| --- | --- | --- | +| Native LOAD TABLE installs a previously dumped MV's objects without changing its recorded source publication | An MV remains read-only at every native import boundary | Shared table-dump schema admission rejects relation kind `m` for DUMP/LOAD before opening files, enumerating objects or calling native Write. Logical export remains available. | +| DELETE FROM an MV source is optimized to physical TRUNCATE and rejected by the dependency guard | Source DELETE remains valid row DML; source identity, last-good MV rows and provenance survive | Physical delete eligibility probes account-qualified source dependencies within the current statement transaction. A dependent source uses row DELETE. Index deletion receives the same eligibility decision. Explicit TRUNCATE keeps its existing guard. | +| SHOW CREATE TABLE emits internal MV storage properties that CREATE TABLE refuses | Standard export emits replayable CREATE MATERIALIZED VIEW and its current refresh policy | Both SHOW consumers call `mv.State.CreateSQL`. Standard SHOW obtains authoritative State; ALTER policy changes cannot be lost through stale relation properties. Snapshot export fails explicitly instead of combining historical identity with current policy. | + +The modern DELETE planner's truncate hint only delegates to legacy planning; +it never performs a physical replacement. Dependency lookup therefore belongs +at the physical eligibility owner, once per otherwise eligible unrestricted +DELETE. It must not run once in that hint and again during legacy planning, or +once more for index maintenance. Ordinary SELECT, filtered DELETE, temporary +relations and MV refresh target deletes gain no dependency SQL. An eligible +ordinary unrestricted DELETE gains a bounded indexed `LIMIT 1` lookup and cached +catalog resolution. No zero-overhead claim is made. + +Pre-migration catalogs remain usable: an unavailable MV runtime or absent +reverse-dependency relation preserves existing ordinary DELETE behavior. Other +metadata/query errors propagate. There is no new background worker, persistent +flag, dependency cache, retry loop or source metadata format. + +## Test cases + +| Layer | Case and independent oracle | +| --- | --- | +| Frontend UT | Existing native LOAD fixture adds kind `m` and requires exact NotSupported admission, before file reading; its mock permits no native Write. Existing unsupported-kind controls retain their typed error. | +| Planner UT | Dependent and independent sources, absent pre-migration catalog (nil and NoSuchTable), catalog error and query error. The delegation hint performs zero probes; physical eligibility performs exactly one, while the dependent DELETE node retains its relation identity. Empty/batched executor Results are closed and the pool is empty afterward. | +| Formatter UT | Manual and authoritative120-second policy with deliberately stale definition policy60; quoted database/view names. | +| Native BVT | Prepare DELETE before creating the MV, then execute after creation with experimental creation disabled. Require two affected rows, empty source, two last-good MV rows and unchanged successful sequence/run/full source TS. | +| Native BVT | Secondary lookup is empty after DELETE; reinserting the same unique keys succeeds. Direct unrestricted DELETE returns two affected rows, repeated empty DELETE returns zero, and explicit TRUNCATE still reports the dependency guard. | +| Native BVT | DUMP/LOAD with a file URI return the MV-kind rejection before file admission; full last-good rows/publication remain unchanged. The review's pre-fix valid-dump reproduction establishes the original bypass. | +| Native BVT | Standard and explicit SHOW DDL strings agree; replay a manual MV under another target and refresh it against the empty source. Read periodic policy60 first, ALTER to120, then repeat the same standard SHOW and replay; stored policy is120. | +| CI consumer | `-consumer-check` is in the existing materialized-view BVT entrypoint, with nonempty successful JSON admission and the existing coverage producer. No additional service deployment or threshold/exclusion change. | + +The native mode owns one two-row indexed source and at most four views in its +own database. It reuses the existing authenticated deployment. Statements and +rows close immediately; cleanup drops views before database RESTRICT, using an +independent30-second context and retaining the original failure. The existing +client15-minute context bounds execution. A prepared statement predating MV +creation is a causal cache-boundary check, not scheduler timing speculation. + +## Evidence and limits + +`materialized_view_consumer_results.json` records exact local selections, +terminal statuses, source/binary identity, native assertions and cleanup. Native +binaries identify the pre-delivery79484a43 working tree with `vcs.modified=true`; +they are not represented as pristine binaries of the later publication commit. +A complete tracked input fingerprint bridges that publication boundary. + +The previous experiment under `/workspace/matrixone-mv-pr` predates the remote +79484a43 update and is preserved separately. Its alternative semantic-context +patch, old native runs and prepared publication objects are not delivered or +claimed as proof for this follow-up. The first follow-up fixture compiler error +(missing test import) and disk-cache relocation diagnostics are retained. Later +terminal build/UT results decide success; an interrupted/missing result is never +counted as a pass. + +These changes do not alter refresh transaction publication, catalog migration, +cron admission, task replay or allocation. Prior evidence for those unchanged +owners remains historical and is not relabeled as a new crash/upgrade run. +No new throughput, speedup, cold-cache, scale or zero-overhead claim is made. +New-head CI and reviewer acceptance are separate from local validation; no +review dismissal, self-approval or merge is performed. + + +Final local validation passed: complete MV/plan/frontend/compile suites; the +final single-probe physical path also passed the complete planner suite. Owning +package and final planner/client vet checks passed. Native final smoke passed +9/9 and the existing entrypoint passed111 checks (70 functional,5 failure,9 +consumer,9 cross-CN,18 SQL bridge), with both CN processes exiting0 and zero +owned database/definition/dependency/history/per-view-task residue. Fresh main +`799523418e` adds four upstream commits without changing these allocations; a +local merge-tree preflight is conflict-free. That preflight is not a claim of +executing the unmerged main tree. Complete source fingerprints have zero delivery +mismatches. Publication-head CI remains a separately observed result. diff --git a/docs/design/materialized_view_consumer_results.json b/docs/design/materialized_view_consumer_results.json new file mode 100644 index 0000000000000..13f7c78915047 --- /dev/null +++ b/docs/design/materialized_view_consumer_results.json @@ -0,0 +1,384 @@ +{ + "base": "79484a43c2a4c984b9cb9e0290805822d6d6a275", + "review": 5562448876, + "date": "2026-10-18", + "source_scope": "focused consumer fixes, protocol119/catalog4.0.17 offset5 unchanged", + "normal_owning": { + "oct18-794-owning-ut.jsonl": [ + { + "Time": "2026-10-18T12:06:54.968367567Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/mv", + "Elapsed": 0.076 + }, + { + "Time": "2026-10-18T12:07:22.990191309Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/sql/plan", + "Elapsed": 21.476 + }, + { + "Time": "2026-10-18T12:07:48.292527135Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/frontend", + "Elapsed": 18.364 + }, + { + "Time": "2026-10-18T12:08:29.320759443Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/sql/compile", + "Elapsed": 9.471 + } + ], + "oct18-794-plan-final-ut.jsonl": [ + { + "Time": "2026-10-18T12:14:18.015883161Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/sql/plan", + "Elapsed": 39.418 + } + ], + "oct18-794-focused-final.jsonl": [ + { + "Time": "2026-10-18T12:04:05.909145047Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/mv", + "Elapsed": 0.081 + }, + { + "Time": "2026-10-18T12:05:17.272339857Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/sql/plan", + "Elapsed": 0.27 + }, + { + "Time": "2026-10-18T12:06:09.593679609Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/frontend", + "Elapsed": 0.148 + } + ] + }, + "selection": { + "oct18-794-owning-ut.jsonl": { + "passed_root_executions": 7815, + "new_roots": [ + "TestMaterializedViewCreateSQL", + "TestMaterializedViewSourceDeleteRetainsRelation", + "TestHandleLoadTableRejectsNonObjectBackedRelations" + ] + }, + "oct18-794-plan-final-ut.jsonl": { + "passed_root_executions": 3859, + "new_roots": [ + "TestMaterializedViewSourceDeleteRetainsRelation" + ] + }, + "oct18-794-focused-final.jsonl": { + "passed_root_executions": 29, + "new_roots": [ + "TestMaterializedViewCreateSQL", + "TestMaterializedViewSourceDeleteRetainsRelation", + "TestHandleLoadTableRejectsNonObjectBackedRelations" + ] + } + }, + "static": { + "gofmt": "passed", + "diff_check": "passed", + "entrypoint_bash_syntax": "passed", + "go_vet": [ + "mv/plan/frontend/compile: exit0", + "final plan + client: exit0" + ] + }, + "native": { + "runs": [ + { + "run": 1, + "exit": 0, + "elapsed": 274.8568880620005, + "entry_sha256": "87f1863e4cc6fc8a1701be52b7e95bc697ff67ea6ba480e63c2726214c86153c", + "modes": { + "functional": { + "started": "2026-10-18T12:18:22.806810426Z", + "passed_cases": [ + "experimental gate", + "deferred population", + "NULL and aggregate semantics", + "independent typed aggregate oracle", + "last committed materialization", + "insert update delete refresh", + "read only: insert into totals(k) values(4)", + "read only: update totals set k=4", + "read only: delete from totals", + "read only: truncate table totals", + "read only: replace into totals(k) values(4)", + "read only: alter table totals add x int", + "read only: drop table totals", + "dependency restrict: alter table facts add x int", + "dependency restrict: truncate table facts", + "dependency restrict: drop table facts", + "dependency restrict: drop database mv_validation", + "failed DROP preserves current database", + "unsupported definition: select rand() from facts", + "unsupported definition: select now() from facts", + "unsupported definition: select distinct k from facts", + "unsupported definition: select count(distinct k) from facts", + "unsupported definition: select * from facts limit 1", + "unsupported definition: select row_number() over(order by id) from facts", + "unsupported definition: select * from totals", + "inner join refresh", + "empty aggregate", + "refresh in user transaction", + "SHOW CREATE", + "scheduled refresh", + "SHOW state and full source timestamp", + "refresh history", + "repeat refresh idempotent rows", + "IF NOT EXISTS no replacement", + "object kind collision", + "duplicate output heading", + "minimum schedule interval", + "MV nesting", + "outer join", + "random sample", + "temporary source", + "grouped empty has zero rows", + "all NULL typed oracle", + "projection and filter", + "dimension mutation", + "captured SQL mode", + "captured context with escaped source identity", + "captured fixed-offset timezone", + "create MV in user transaction", + "rename dependent source", + "foreign key into MV", + "prepared read after refresh", + "concurrent readers see complete publications", + "concurrent refresh publication", + "MV grant requires source SELECT", + "MV plus source grant permits read", + "prepared source ACL revocation", + "nonowner refresh rejected", + "nonowner drop rejected", + "SHOW owner isolation", + "scheduled refresh blocked for suspend account preserves rows and provenance", + "scheduled refresh resumes after reopening suspend account", + "scheduled refresh blocked for restricted account preserves rows and provenance", + "scheduled refresh resumes after reopening restricted account", + "same-name multi-tenant source and MV isolation", + "tenant DROP DATABASE restricts surviving MVs", + "DROP ACCOUNT failure rolls back retired objects, policy and metadata", + "DROP ACCOUNT retires surviving populated and periodic MVs", + "cancelled client read", + "drop cleanup" + ], + "raw_report_sha256": "1168c62924b6a5d74fd6029571e39172ff682cb88b1393cfb655f7f3f449246f" + }, + "failure": { + "started": "2026-10-18T12:22:53.395368443Z", + "passed_cases": [ + "native source-expression refresh failure", + "native failed refresh preserves rows", + "native failed refresh diagnostic", + "drop removes MV state", + "dependency cleanup permits database drop" + ], + "raw_report_sha256": "40bfb22e982ad7cd05fa0ae2d1f0a055c41d773094a18fe89ec4a1640852decb" + }, + "consumers": { + "started": "2026-10-18T12:22:53.774725478Z", + "passed_cases": [ + "prepared unrestricted source DELETE preserves MV publication", + "source DELETE maintains secondary and unique indexes", + "explicit source TRUNCATE remains protected", + "direct unrestricted source DELETE keeps dependency identity", + "empty dependent source DELETE returns zero affected rows", + "MV rejected at native boundary: dump table stored to ", + "MV rejected at native boundary: load table stored from ", + "SHOW CREATE TABLE round-trips a manual MV", + "SHOW CREATE TABLE exports the authoritative altered refresh policy" + ], + "raw_report_sha256": "b352f02f006dbd280e9c96e354210a77c9c35de4103f59db4a88209393b4307a" + }, + "multi-cn": { + "started": "2026-10-18T12:22:54.607300209Z", + "passed_cases": [ + "second CN rejects unpopulated view", + "cross-CN publication visibility", + "second CN can refresh independently", + "two-CN concurrent publication version 2", + "two-CN concurrent publication version 3", + "two-CN concurrent publication version 4", + "two-CN concurrent publication version 5", + "two-CN concurrent publication version 6", + "cross-CN terminal history" + ], + "raw_report_sha256": "9d9f2ed3cf29eac9dc95b191066a067018474298acb895ed6423930e4af913be" + }, + "native-probe": { + "runs": [ + { + "passed_requests": 9, + "process_exit": 0 + }, + { + "passed_requests": 9, + "process_exit": 0 + } + ] + } + } + } + ], + "cleanup": [ + [ + { + "sql": "select count(*) from mo_catalog.mo_database where datname in ('mv_validation','mv_validation_multi_cn','mv_consumer_validation')", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_catalog.mo_materialized_views where database_name like 'mv_%'", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_catalog.mo_mv_dependencies", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_catalog.mo_mv_refresh_runs", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_task.sys_async_task where task_metadata_id like 'mv:%'", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + } + ] + ], + "process_exits": { + "second": 0, + "primary": 0 + }, + "started": 1792325882.1555476, + "protocol_inventory": { + "error": "", + "rows": [ + [ + "{\n \"method\": \"GETPROTOCOLVERSION\",\n \"result\": \"dd1dccb4-4d3c-41f8-b482-5251dc7a41bf:119, ee1dccb4-4d3c-41f8-b482-5251dc7a41bf:119\"\n}\n" + ] + ] + }, + "consumer_smoke": { + "started": "2026-10-18T12:18:20.228893814Z", + "passed_cases": [ + "prepared unrestricted source DELETE preserves MV publication", + "source DELETE maintains secondary and unique indexes", + "explicit source TRUNCATE remains protected", + "direct unrestricted source DELETE keeps dependency identity", + "empty dependent source DELETE returns zero affected rows", + "MV rejected at native boundary: dump table stored to ", + "MV rejected at native boundary: load table stored from ", + "SHOW CREATE TABLE round-trips a manual MV", + "SHOW CREATE TABLE exports the authoritative altered refresh policy" + ], + "raw_report_sha256": "56f8d06a4e415cf570133d1f3b8190916ed754e1ab95a16eed94cd66c872087c" + }, + "elapsed": 295.5896084308624 + }, + "binary": { + "sha256": "24ccd3f75ddc2f0ce39b7617194a0e737253653b31a20761aefe11b3db675767", + "build_info": [ + "build\tCGO_ENABLED=1", + "build\tGOEXPERIMENT=simd", + "build\tGOAMD64=v3", + "build\tvcs.revision=79484a43c2a4c984b9cb9e0290805822d6d6a275", + "build\tvcs.time=2026-10-18T07:15:31Z", + "build\tvcs.modified=true" + ], + "build_info_sha256": "b4e53821bb02e08b121ddceeb786c2976e7fc8ce2677b5023a22d7472cad1f7b", + "build_log_sha256": "d1b9f2125d09c78f5c576e2e0e410749498af52699f591269bb5a0c5086d32f6", + "identity": "local79484a43 + working changes, vcs.modified=true; not a pristine publication build" + }, + "native_provenance": { + "verification_exit": 0, + "stamp": "format=7\nmakefile=af01ecc6bfae603ba92999f05a5b2a171458400c\ncgo=b5d332f7df4fd5cfb1999bfacb984e7ce0312936\nthirdparties=7f44ba0668d91ff945d3e4815cfa708f3ba207c6\ngoos=linux\ngoarch=amd64\naccelerator=cpu\noptimization=release\nsimsimd=0\ncommon-environment=3ebdf95abd2bcb3378a485bb49a28fac0510fa44\naccelerator-environment=9ad272c392b2d022ec76b99e27f0b62d74757517\nlibmo-hash=46f44b7364f6c493ed8cf97b64a592eb19482db0\nthirdparty-hash=475d29f28f731cb1e94c0a815c0ded40a2450e2a\ncuda-fatbin-hash=none\n" + }, + "inputs": { + "tracked_non_documentation_files": 11210, + "canonical_map_sha256": "7bc2d8819820cf3deee538934b645b194c4cefb123ca05c15629459c66876fb0", + "changed_input_sha256": { + "optools/run_materialized_view_bvt.sh": "87f1863e4cc6fc8a1701be52b7e95bc697ff67ea6ba480e63c2726214c86153c", + "pkg/frontend/materialized_view.go": "1c375fafbc8a340cd58f7059a093472332db45d90c9552fca499d43e23eafc53", + "pkg/frontend/table_dump.go": "09fec25b44430dbf8170db05d8f579299b07f8f56b20c7e4f5ea4735d8fe5ae7", + "pkg/frontend/table_dump_test.go": "7d1eef8a0dc67011d1982edc7d7c18a3825810fb090f5112ea0aa94120b7d3ac", + "pkg/mv/service.go": "200963f06427c42c8ac4b3b79e780c31c9c6394f475584105ac3436ffb04de5a", + "pkg/mv/service_test.go": "411bd3909b5cdf98cecc989f1bf23073ca380de5a3a7184194001d2a8b9d17cc", + "pkg/sql/plan/build_dml_util.go": "a87b754657a829f1cd447f045b0e9444a14bebad3ccc004893e87067088e18ad", + "pkg/sql/plan/build_show.go": "f83de3cc3f33b32b4d6e714d5b1f70d1dbb9745a39012f5e4a5caedacabaacea", + "pkg/sql/plan/materialized_view.go": "1966f429a733de90ab49cb67877f10615d8bb802a8fe6664a9d9b5246c822de9", + "pkg/sql/plan/materialized_view_delete_test.go": "d11d23d55aaca64a7271602815565621ac1ffceb5881e1913ec580ec2a121216", + "test/materialized_view/README.md": "20dbefceb5520d3dfa6da4b24c00bbe35ff061a02e2fbd4795288c0a8c33d840", + "test/materialized_view/consumers.go": "d35374bacbffe79d0bb5493773f841e95ecb45ec8f815d35da668fb3f1e86736", + "test/materialized_view/main.go": "c0820622880002739e3b0028f2924cfcf0884ac6df1bb27d6618f7aca37fd78f" + }, + "delivery_mismatches": 0, + "exclusions": "docs/ contains evidence and narration; untracked coverage counters are build artifacts and are not delivered" + }, + "limits": [ + "one local authenticated two-CN topology; no new crash/upgrade or arbitrary release-pair claim", + "no new throughput/speedup/cold-cache/scale/zero-overhead measurement", + "baseline79484a43 CI green; publication-head CI and external reviewer acceptance remain separate" + ], + "risk_review": { + "decision": "no remaining source blocker in focused closures", + "cached_plan": "native prepared DELETE predating MV creation passed on final physical-eligibility path; no speculative cache mechanism added", + "ownership": "query Results close; State retains its existing30s transaction owner; no new worker/cache/growing state", + "cost": "one indexed LIMIT1 probe only for physical truncate candidates; reuse index decision; no per-row or ordinary SELECT catalog SQL", + "race_scope": "no changed shared Go memory or lifecycle owner; transactional identity uses existing owners and native causal/two-CN checks, not a new Go race claim" + }, + "integration_preflight": { + "fresh_main": "799523418e9f941afd65cd440d24e7fa0003a35e", + "delta_from_frozen_main": "four later upstream commits; protocol/catalog allocations unchanged", + "merge_tree": { + "exit": 0, + "tree": "2ff0e5f583423894e7e10edae8afdc89779a6d5c", + "scope": "content-conflict preflight only; main is not merged into the native test candidate" + } + } +} diff --git a/docs/design/materialized_view_validation.md b/docs/design/materialized_view_validation.md index 0b1bc5db5d4ec..40eb62cb63f05 100644 --- a/docs/design/materialized_view_validation.md +++ b/docs/design/materialized_view_validation.md @@ -308,3 +308,16 @@ privilege checks retained, and proves six DDL guards in each transaction mode. Normal account/ACL cases use authenticated sessions. This does not satisfy the separate normal-login/mixed-version release gate. Case-level/source hashes and functional fixture cost are in materialized_view_review_lifecycle_results.json. + + +## Native consumer regression follow-up (2026-10-18) + +Review5562448876 adds three acceptance boundaries: native object loading must +reject MV targets before file/Write admission; unrestricted source DELETE must +use row DML when dependencies pin identity, with matching index maintenance; +and standard SHOW CREATE TABLE must export the same logical MV/current policy +as explicit SHOW CREATE MATERIALIZED VIEW. The executable `-consumer-check` +mode includes prepared-before-creation and feature-disabled DELETE, affected-row +boundaries, unique/secondary controls, unchanged publication, native import +rejection and manual/altered-policy DDL replay. See +[consumer corrections](materialized_view_consumer_fixes.md) and its evidence JSON. diff --git a/optools/run_materialized_view_bvt.sh b/optools/run_materialized_view_bvt.sh index 6c08f0c6fb1a7..356155b88a06a 100644 --- a/optools/run_materialized_view_bvt.sh +++ b/optools/run_materialized_view_bvt.sh @@ -11,7 +11,7 @@ mkdir -p "$2" "${repo_root}/coverage" report_dir=$(cd "$2" && pwd) coverage_dir=$(cd "${repo_root}/coverage" && pwd) # A rerun must not accept a previous success if the client cannot write JSON. -rm -f "${report_dir}/functional.json" "${report_dir}/failure.json" "${report_dir}/multi-cn.json" "${report_dir}/native-probe.json" +rm -f "${report_dir}/consumers.json" "${report_dir}/functional.json" "${report_dir}/failure.json" "${report_dir}/multi-cn.json" "${report_dir}/native-probe.json" cn_dsn() { local endpoint port @@ -43,6 +43,8 @@ python3 "${repo_root}/test/materialized_view/native_probe/check.py" \ -output "${report_dir}/functional.json" "${build_dir}/mv-validation" -dsn "${primary_dsn}" -edge-check \ -output "${report_dir}/failure.json" +"${build_dir}/mv-validation" -dsn "${primary_dsn}" -consumer-check \ + -output "${report_dir}/consumers.json" "${build_dir}/mv-validation" -dsn "${primary_dsn}" -second-dsn "${second_dsn}" \ -output "${report_dir}/multi-cn.json" # Fail closed if a mode exits without its nonempty, successful evidence report. @@ -56,7 +58,7 @@ if probe != {"runs": [{"passed_requests": 9, "process_exit": 0}] * 2}: raise SystemExit("Incomplete materialized-view native SQL bridge checks") print("Materialized-view native SQL bridge: 2 x 9 requests passed") -for name in ("functional", "failure", "multi-cn"): +for name in ("functional", "failure", "consumers", "multi-cn"): result = json.loads((pathlib.Path(sys.argv[1]) / (name + ".json")).read_text()) if result.get("error") or not result.get("passed_cases"): raise SystemExit("Incomplete materialized-view BVT: " + name) diff --git a/pkg/frontend/materialized_view.go b/pkg/frontend/materialized_view.go index 561166b4c3e3b..2aece61862528 100644 --- a/pkg/frontend/materialized_view.go +++ b/pkg/frontend/materialized_view.go @@ -242,11 +242,7 @@ func handleShowMaterializedViews(ctx context.Context, ses *Session, stmt *tree.S if err != nil { return err } - policy := "manual" - if state.Interval > 0 { - policy = fmt.Sprintf("every interval %d second", state.Interval) - } - m.AddRow([]interface{}{string(stmt.Name.ObjectName), "create materialized view " + mv.Quote(state.Database) + "." + mv.Quote(state.Name) + " refresh " + policy + " as " + def.Query}) + m.AddRow([]interface{}{string(stmt.Name.ObjectName), state.CreateSQL()}) return nil } query = fmt.Sprintf("select run_id,status,sequence,epoch,error_message from mo_catalog.mo_mv_refresh_runs where account_id=%d and mv_id=%d order by sequence desc limit 100", key.Account, key.ID) diff --git a/pkg/frontend/table_dump.go b/pkg/frontend/table_dump.go index 174c52118c20f..7013018a9e9ca 100644 --- a/pkg/frontend/table_dump.go +++ b/pkg/frontend/table_dump.go @@ -529,7 +529,7 @@ func validateTableDumpSchema(def *plan.TableDef) error { switch def.TableType { case catalog.SystemExternalRel, catalog.SystemSourceRel: return moerr.NewNotSupportedNoCtx("DUMP TABLE and LOAD TABLE with external or source tables") - case catalog.SystemViewRel: + case catalog.SystemViewRel, catalog.SystemMaterializedViewRel: return moerr.NewNotSupportedNoCtx("DUMP TABLE and LOAD TABLE with views") case catalog.SystemSequenceRel: return moerr.NewNotSupportedNoCtx("DUMP TABLE and LOAD TABLE with sequences") diff --git a/pkg/frontend/table_dump_test.go b/pkg/frontend/table_dump_test.go index 0baeef70d26c1..b444d1262dffb 100644 --- a/pkg/frontend/table_dump_test.go +++ b/pkg/frontend/table_dump_test.go @@ -30,6 +30,7 @@ import ( "github.com/gogo/protobuf/proto" "github.com/golang/mock/gomock" + "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/prashantv/gostub" "github.com/stretchr/testify/require" @@ -1117,6 +1118,7 @@ func TestHandleDumpTableRejectsUnsupportedSchemas(t *testing.T) { {name: "external", def: &plan.TableDef{Name: "orders", TableType: catalog.SystemExternalRel}}, {name: "source", def: &plan.TableDef{Name: "orders", TableType: catalog.SystemSourceRel}}, {name: "view", def: &plan.TableDef{Name: "orders", TableType: catalog.SystemViewRel}}, + {name: "materialized view", def: &plan.TableDef{Name: "orders", TableType: catalog.SystemMaterializedViewRel}}, {name: "sequence", def: &plan.TableDef{Name: "orders", TableType: catalog.SystemSequenceRel}}, {name: "transient", def: &plan.TableDef{Name: "orders", TableType: catalog.SystemTransientRel}}, {name: "view-sql", def: &plan.TableDef{Name: "orders", ViewSql: &plan.ViewDef{}}}, @@ -1173,7 +1175,7 @@ func TestHandleLoadTableRejectsNonObjectBackedRelations(t *testing.T) { Table: tree.NewTableName("orders", tree.ObjectNamePrefix{}, nil), Path: t.TempDir(), }) - require.Error(t, err) + require.True(t, moerr.IsMoErrCode(err, moerr.ErrNotSupported), "schema admission must reject before reading any dump files: %v", err) }) } } diff --git a/pkg/mv/service.go b/pkg/mv/service.go index b06a848a281d9..edf902c154cbc 100644 --- a/pkg/mv/service.go +++ b/pkg/mv/service.go @@ -51,6 +51,16 @@ type State struct { Interval int64 } +// CreateSQL reconstructs the logical object using its authoritative policy. +// Internal storage properties and refresh provenance are never export DDL. +func (st *State) CreateSQL() string { + policy := "manual" + if st.Interval > 0 { + policy = fmt.Sprintf("every interval %d second", st.Interval) + } + return "create materialized view " + Quote(st.Database) + "." + Quote(st.Name) + " refresh " + policy + " as " + st.Definition.Query +} + // Service owns bounded per-CN admission, not cluster-wide publication locks. // Fixed account buckets conservatively serialize collisions without a growing // tenant-to-semaphore map. Transaction conflict detection fences publishers. diff --git a/pkg/mv/service_test.go b/pkg/mv/service_test.go index 5848ac8f47015..ea804de2191da 100644 --- a/pkg/mv/service_test.go +++ b/pkg/mv/service_test.go @@ -396,3 +396,13 @@ func TestMaterializedViewLegacyRefreshDoesNotPublish(t *testing.T) { require.Zero(t, e.publications) require.Equal(t, "last-good", e.state.LastRun) } + +func TestMaterializedViewCreateSQL(t *testing.T) { + for _, tc := range []struct { + interval int64 + policy string + }{{0, "manual"}, {120, "every interval 120 second"}} { + state := &State{Database: "db`name", Name: "mv`name", Interval: tc.interval, Definition: catalog.MVDefinition{Query: "select k from `source`", IntervalSeconds: 60}} + require.Equal(t, "create materialized view `db``name`.`mv``name` refresh "+tc.policy+" as select k from `source`", state.CreateSQL()) + } +} diff --git a/pkg/sql/plan/build_dml_util.go b/pkg/sql/plan/build_dml_util.go index 6c1a70dd0714e..b03a921e17e79 100644 --- a/pkg/sql/plan/build_dml_util.go +++ b/pkg/sql/plan/build_dml_util.go @@ -1115,10 +1115,18 @@ func buildDeletePlans(ctx CompilerContext, builder *QueryBuilder, bindCtx *BindC } } + if canTruncate { + dependent, err := hasMaterializedViewDependents(ctx, delCtx.tableDef) + if err != nil { + return err + } + canTruncate = !dependent + } + lastNodeId := appendDeleteSourceScan() if !delCtx.skipTargetDelete { // create delete index plans - err = buildDeleteIndexPlans(ctx, builder, bindCtx, delCtx) + err = buildDeleteIndexPlans(ctx, builder, bindCtx, delCtx, canTruncate) if err != nil { return err } @@ -7083,7 +7091,7 @@ func indexNeedsRewriteForUpdate(tableDef *TableDef, indexdef *IndexDef, updateCo } // make delete index plans here -func buildDeleteIndexPlans(ctx CompilerContext, builder *QueryBuilder, bindCtx *BindContext, delCtx *dmlPlanCtx) error { +func buildDeleteIndexPlans(ctx CompilerContext, builder *QueryBuilder, bindCtx *BindContext, delCtx *dmlPlanCtx, canTruncate bool) error { isUpdate := delCtx.updateColLength > 0 @@ -7093,26 +7101,9 @@ func buildDeleteIndexPlans(ctx CompilerContext, builder *QueryBuilder, bindCtx * // both UK and SK. To handle SK case, we will have flags to indicate if it's UK or SK. hasUniqueKey := haveUniqueKey(delCtx.tableDef) hasSecondaryKey := haveSecondaryKey(delCtx.tableDef) - // Keep temporary index maintenance on the same row-delete path as its base - // table; skipping it would leave stale index entries after DELETE. - canTruncate := delCtx.isUnrestrictedDelete && !delCtx.tableDef.IsTemporary && delCtx.tableDef.TableType != catalog.SystemMaterializedViewRel - - accountId, err := ctx.GetAccountId() - if err != nil { - return err - } - - enabled, err := IsForeignKeyChecksEnabled(ctx) - if err != nil { - return err - } - - if enabled && len(delCtx.tableDef.RefChildTbls) > 0 || - delCtx.tableDef.ViewSql != nil || - (util.TableIsClusterTable(delCtx.tableDef.GetTableType()) && accountId != catalog.System_Account) || - delCtx.objRef.PubInfo != nil { - canTruncate = false - } + // Share the base-table decision, including MV dependencies, partitions and + // delete_opt_to_truncate. Otherwise skipped index deletes leave stale keys. + var err error if (hasUniqueKey || hasSecondaryKey) && !canTruncate { typMap := make(map[string]plan.Type) diff --git a/pkg/sql/plan/build_show.go b/pkg/sql/plan/build_show.go index 266cbccfba2d6..2f9201ca911a1 100644 --- a/pkg/sql/plan/build_show.go +++ b/pkg/sql/plan/build_show.go @@ -24,10 +24,12 @@ import ( "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/common/pubsub" + moruntime "github.com/matrixorigin/matrixone/pkg/common/runtime" "github.com/matrixorigin/matrixone/pkg/common/sqlquote" "github.com/matrixorigin/matrixone/pkg/container/types" "github.com/matrixorigin/matrixone/pkg/defines" "github.com/matrixorigin/matrixone/pkg/frontend/databranchutils" + "github.com/matrixorigin/matrixone/pkg/mv" "github.com/matrixorigin/matrixone/pkg/pb/plan" "github.com/matrixorigin/matrixone/pkg/sql/parsers" "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect" @@ -159,6 +161,26 @@ func buildShowCreateTable(stmt *tree.ShowCreateTable, ctx CompilerContext) (*Pla if err = ValidateSnapshotScope(snapshot, dbName, tblName, tableDef.DbId, SnapshotTableID(tableDef)); err != nil { return nil, err } + if tableDef.TableType == catalog.SystemMaterializedViewRel { + if IsSnapshotValid(snapshot) { + return nil, moerr.NewNotSupported(ctx.GetContext(), "historical materialized view export") + } + account, err := ctx.GetAccountId() + if err != nil { + return nil, err + } + value, ok := moruntime.ServiceRuntime(ctx.GetProcess().GetService()).GetGlobalVariables(mv.RuntimeKey) + service, valid := value.(*mv.Service) + if !ok || !valid { + return nil, moerr.NewInternalError(ctx.GetContext(), "materialized view service is unavailable") + } + state, err := service.State(ctx.GetContext(), mv.Key{Account: account, ID: tableDef.TblId}) + if err != nil { + return nil, err + } + sql := fmt.Sprintf("SELECT %s AS `Table`, %s AS `Create Table`", formatStrLit(tblName), formatStrLit(state.CreateSQL())) + return returnByRewriteSQL(ctx, sql, plan.DataDefinition_SHOW_CREATETABLE) + } if tableDef.TableType == catalog.SystemViewRel { var newStmt *tree.ShowCreateView if stmt.Name.NumParts == 1 { diff --git a/pkg/sql/plan/materialized_view.go b/pkg/sql/plan/materialized_view.go index e8e97ae70da49..bf7c5d0ff5129 100644 --- a/pkg/sql/plan/materialized_view.go +++ b/pkg/sql/plan/materialized_view.go @@ -16,13 +16,17 @@ package plan import ( "encoding/json" + "fmt" "reflect" "strings" "time" "github.com/matrixorigin/matrixone/pkg/catalog" "github.com/matrixorigin/matrixone/pkg/common/moerr" + moruntime "github.com/matrixorigin/matrixone/pkg/common/runtime" + "github.com/matrixorigin/matrixone/pkg/container/vector" "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/mv" pb "github.com/matrixorigin/matrixone/pkg/pb/plan" "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect" "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect/mysql" @@ -261,3 +265,38 @@ func materializedViewOwnerName(wire string) string { } return wire } + +// hasMaterializedViewDependents prevents a row DELETE from replacing the +// physical identity pinned by an MV. Resolve admits pre-migration catalogs; +// the indexed probe shares the statement transaction and tenant identity. +func hasMaterializedViewDependents(ctx CompilerContext, table *TableDef) (bool, error) { + proc := ctx.GetProcess() + if proc == nil { + return false, nil + } + if _, available := moruntime.ServiceRuntime(proc.GetService()).GetGlobalVariables(mv.RuntimeKey); !available { + return false, nil + } + _, dependencies, err := ctx.Resolve(catalog.MO_CATALOG, catalog.MO_MV_DEPENDENCIES, nil) + if moerr.IsMoErrCode(err, moerr.ErrNoSuchTable) { + return false, nil + } + if err != nil { + return false, err + } + if dependencies == nil { + return false, nil + } + account, err := ctx.GetAccountId() + if err != nil { + return false, err + } + result, err := runSql(ctx, fmt.Sprintf("select mv_id from mo_catalog.mo_mv_dependencies where account_id=%d and source_table_id=%d limit 1", account, table.TblId)) + if err != nil { + return false, err + } + defer result.Close() + found := false + result.ReadRows(func(n int, _ []*vector.Vector) bool { found = n > 0; return !found }) + return found, nil +} diff --git a/pkg/sql/plan/materialized_view_delete_test.go b/pkg/sql/plan/materialized_view_delete_test.go new file mode 100644 index 0000000000000..d59ee02238e35 --- /dev/null +++ b/pkg/sql/plan/materialized_view_delete_test.go @@ -0,0 +1,122 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package plan + +import ( + "context" + "errors" + "fmt" + "testing" + + "github.com/matrixorigin/matrixone/pkg/catalog" + "github.com/matrixorigin/matrixone/pkg/common/moerr" + "github.com/matrixorigin/matrixone/pkg/common/mpool" + "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/defines" + "github.com/matrixorigin/matrixone/pkg/mv" + pb "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/dialect/mysql" + "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" + "github.com/matrixorigin/matrixone/pkg/util/executor" + "github.com/matrixorigin/matrixone/pkg/vm/process" + "github.com/stretchr/testify/require" +) + +type materializedViewDeleteContext struct { + *MockCompilerContext + sql executor.SQLExecutor + catalogError error + missing bool +} + +func (c *materializedViewDeleteContext) getInternalSQLExecutor(*process.Process) (executor.SQLExecutor, bool) { + return c.sql, true +} +func (c *materializedViewDeleteContext) Resolve(db, name string, snapshot *Snapshot) (*ObjectRef, *TableDef, error) { + if db == catalog.MO_CATALOG && name == catalog.MO_MV_DEPENDENCIES { + if c.catalogError != nil { + return nil, nil, c.catalogError + } + if c.missing { + return nil, nil, nil + } + return &ObjectRef{SchemaName: db, ObjName: name}, &TableDef{Name: name}, nil + } + return c.MockCompilerContext.Resolve(db, name, snapshot) +} +func TestMaterializedViewSourceDeleteRetainsRelation(t *testing.T) { + for _, name := range []string{"dependent", "independent", "pre-migration", "missing catalog error", "catalog failure", "probe failure"} { + t.Run(name, func(t *testing.T) { + proc := newPlanTestProcess(t) + proc.ReplaceTopCtx(defines.AttachAccountId(context.Background(), 0)) + base := NewMockCompilerContext(true, proc) + c := &materializedViewDeleteContext{MockCompilerContext: base, missing: name == "pre-migration"} + injected := errors.New("metadata unavailable") + if name == "catalog failure" { + c.catalogError = injected + } + if name == "missing catalog error" { + c.catalogError = moerr.NewNoSuchTable(proc.Ctx, catalog.MO_CATALOG, catalog.MO_MV_DEPENDENCIES) + } + setPlanTestGlobalVariable(t, proc.GetService(), mv.RuntimeKey, true) + mp := mpool.MustNewZero() + t.Cleanup(func() { defer mpool.DeleteMPool(mp); require.Zero(t, mp.CurrNB()) }) + calls := 0 + table := base.tables["nation"] + c.sql = executor.NewMemExecutor(func(sql string) (executor.Result, error) { + calls++ + require.Equal(t, fmt.Sprintf("select mv_id from mo_catalog.mo_mv_dependencies where account_id=0 and source_table_id=%d limit 1", table.TblId), sql) + if name == "probe failure" { + return executor.Result{}, injected + } + r := executor.NewMemResult([]types.Type{types.T_uint64.ToType()}, mp) + if name == "dependent" { + r.NewBatchWithRowCount(1) + require.NoError(t, executor.AppendFixedRows(r, 0, []uint64{99})) + } + return r.GetResult(), nil + }) + dml := &DMLContext{tableDefs: []*TableDef{table}, objRefs: []*ObjectRef{{SchemaName: "tpch", ObjName: "nation"}}, isClusterTable: []bool{false}} + // This modern-planner hint only requests legacy planning; it does + // not execute a truncate. Probe once at physical eligibility below. + allowed, err := canDeleteRewriteToTruncate(c, dml) + require.NoError(t, err) + require.True(t, allowed) + require.Zero(t, calls) + stmt, err := mysql.ParseOne(c.GetContext(), "delete from tpch.nation", 1) + require.NoError(t, err) + defer stmt.Free() + p, err := buildDelete(stmt.(*tree.Delete), c, false) + if name == "catalog failure" || name == "probe failure" { + require.ErrorIs(t, err, injected) + return + } + require.NoError(t, err) + found := false + for _, n := range p.GetQuery().Nodes { + if n.NodeType == pb.Node_DELETE && n.DeleteCtx.TableDef.TblId == table.TblId { + found = true + require.Equal(t, name != "dependent", n.DeleteCtx.CanTruncate) + } + } + require.True(t, found) + if name == "dependent" || name == "independent" { + require.Equal(t, 1, calls, "index eligibility must reuse the base-table decision") + } else { + require.Zero(t, calls) + } + }) + } +} diff --git a/test/materialized_view/README.md b/test/materialized_view/README.md index 50ef1e153035a..49472367e2c9b 100644 --- a/test/materialized_view/README.md +++ b/test/materialized_view/README.md @@ -152,3 +152,15 @@ the compiler guard, with privilege checks still enabled. This scoped fixture is not mixed-version or login-compatibility evidence. It never edits system schemas and cleans its own database. Validate both transaction modes by configuring `cn.txn.mode` to `pessimistic` or `optimistic` on that isolated CN. + + +`-consumer-check` selects the native consumer regressions for review5562448876. +It reuses the existing authenticated BVT service and owns a two-row indexed +source, manual MVs and one altered periodic policy. Nine checks cover prepared +DELETE before MV creation, unrestricted DELETE with creation disabled, affected +rows including an empty source, unique/secondary maintenance, explicit TRUNCATE +protection, DUMP/LOAD kind admission before file access with unchanged publication, +and SHOW CREATE TABLE equality/replay for manual and altered periodic policies. +The fixture drops its MVs before its database on both success and failure. The +normal BVT entrypoint includes the mode and requires a nonempty successful JSON +report, using the same deployment and coverage path. diff --git a/test/materialized_view/consumers.go b/test/materialized_view/consumers.go new file mode 100644 index 0000000000000..3fa79f2193339 --- /dev/null +++ b/test/materialized_view/consumers.go @@ -0,0 +1,155 @@ +// Copyright 2026 Matrix Origin +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "context" + "fmt" + "reflect" + "strings" + "time" +) + +func runConsumerCases() { + db.SetMaxOpenConns(1) + exec("create database mv_consumer_validation") + defer func() { + failure := recover() + cleanup, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + var failures []string + for _, name := range []string{"stored_copy", "policy_copy", "policy", "stored"} { + if _, err := db.ExecContext(cleanup, "drop materialized view if exists mv_consumer_validation."+name); err != nil { + failures = append(failures, err.Error()) + } + } + if _, err := db.ExecContext(cleanup, "drop database mv_consumer_validation"); err != nil { + failures = append(failures, err.Error()) + } + if len(failures) > 0 { + panic(fmt.Sprintf("consumer cleanup: %v; original=%v", failures, failure)) + } + if failure != nil { + panic(failure) + } + }() + exec("use mv_consumer_validation") + exec("set experimental_materialized_view=1") + exec("set time_zone='+00:00'") + exec("set delete_opt_to_truncate=1") + exec("create table facts(id int primary key,k int unique,skey int,index sk(skey))") + const insert = "insert into facts values(1,11,10),(2,22,20)" + exec(insert) + // This statement predates dependency creation: cached eligibility must not + // turn valid source DML into a rejected physical-identity replacement. + prepared, err := db.PrepareContext(ctx, "delete from facts") + if err != nil { + panic(err) + } + defer prepared.Close() + exec("create materialized view stored refresh manual as select id,k,skey from facts") + exec("refresh materialized view stored") + const publication = "select successful_sequence,last_run,source_physical,source_logical from mo_catalog.mo_materialized_views where account_id=0 and database_name='mv_consumer_validation' and name='stored'" + before := rows(publication) + exec("set experimental_materialized_view=0") + deleted, err := prepared.ExecContext(ctx) + if err != nil { + panic(fmt.Errorf("prepared source DELETE after MV creation: %w", err)) + } + if !reflect.DeepEqual(rows("select count(*) from facts"), [][]string{{"0"}}) || !reflect.DeepEqual(rows("select count(*) from stored"), [][]string{{"2"}}) || !reflect.DeepEqual(before, rows(publication)) { + panic("prepared source DELETE changed MV publication") + } + affected, err := deleted.RowsAffected() + if err != nil || affected != 2 { + panic(fmt.Sprintf("prepared DELETE affected rows: %d %v", affected, err)) + } + pass("prepared unrestricted source DELETE preserves MV publication") + if !reflect.DeepEqual(rows("select count(*) from facts force index(sk) where skey=10"), [][]string{{"0"}}) { + panic("source DELETE left secondary index rows") + } + exec(insert) + pass("source DELETE maintains secondary and unique indexes") + _, err = db.ExecContext(ctx, "truncate table facts") + requireServerRejection("explicit source TRUNCATE remains protected", err) + if !strings.Contains(err.Error(), "dependent materialized views") { + panic(err) + } + pass("explicit source TRUNCATE remains protected") + deleted, err = db.ExecContext(ctx, "delete from facts") + if err != nil { + panic(err) + } + affected, err = deleted.RowsAffected() + if err != nil || affected != 2 { + panic(fmt.Sprintf("direct DELETE affected rows: %d %v", affected, err)) + } + if !reflect.DeepEqual(rows("select count(*) from facts"), [][]string{{"0"}}) || !reflect.DeepEqual(before, rows(publication)) { + panic("direct source DELETE changed identity/publication") + } + pass("direct unrestricted source DELETE keeps dependency identity") + deleted, err = db.ExecContext(ctx, "delete from facts") + if err != nil { + panic(err) + } + affected, err = deleted.RowsAffected() + if err != nil || affected != 0 { + panic(fmt.Sprintf("empty DELETE affected rows: %d %v", affected, err)) + } + pass("empty dependent source DELETE returns zero affected rows") + for _, verb := range []string{"dump table stored to ", "load table stored from "} { + _, err := db.ExecContext(ctx, verb+"'file:///tmp/mv-consumer-missing-dump'") + requireServerRejection("native dump/load MV admission", err) + if !strings.Contains(err.Error(), "DUMP TABLE and LOAD TABLE with views") { + panic(fmt.Errorf("expected MV kind rejection before file access: %w", err)) + } + if !reflect.DeepEqual(rows("select count(*) from stored"), [][]string{{"2"}}) || !reflect.DeepEqual(before, rows(publication)) { + panic("dump/load changed MV rows or provenance") + } + pass("MV rejected at native boundary: " + verb) + } + replay := func(name, target string) { + ddl := rows("show create table " + name) + explicit := rows("show create materialized view " + name) + if len(ddl) != 1 || len(ddl[0]) != 2 || len(explicit) != 1 || ddl[0][1] != explicit[0][1] || !strings.HasPrefix(ddl[0][1], "create materialized view ") || strings.Contains(ddl[0][1], "mo_materialized_view") { + panic(fmt.Sprintf("inconsistent MV export: %v %v", ddl, explicit)) + } + old := "`mv_consumer_validation`.`" + name + "`" + renamed := strings.Replace(ddl[0][1], old, "`mv_consumer_validation`.`"+target+"`", 1) + if renamed == ddl[0][1] { + panic("export omitted qualified target") + } + exec(renamed) + } + exec("set experimental_materialized_view=1") + replay("stored", "stored_copy") + exec("refresh materialized view stored_copy") + if !reflect.DeepEqual(rows("select count(*) from stored_copy"), [][]string{{"0"}}) { + panic("replayed manual MV did not refresh from current source") + } + pass("SHOW CREATE TABLE round-trips a manual MV") + exec("create materialized view policy refresh every interval 60 second as select id from facts") + initialPolicy := rows("show create table policy") + if len(initialPolicy) != 1 || !strings.Contains(initialPolicy[0][1], "every interval 60 second") { + panic("initial export lost periodic policy") + } + exec("alter materialized view policy refresh every interval 120 second") + replay("policy", "policy_copy") + if !reflect.DeepEqual(rows("select interval_seconds from mo_catalog.mo_materialized_views where account_id=0 and database_name='mv_consumer_validation' and name='policy_copy'"), [][]string{{"120"}}) { + panic("export replay lost current altered policy") + } + exec("alter materialized view policy refresh manual") + exec("alter materialized view policy_copy refresh manual") + pass("SHOW CREATE TABLE exports the authoritative altered refresh policy") +} diff --git a/test/materialized_view/main.go b/test/materialized_view/main.go index 46ab0b020c32a..c38cedaf4f996 100644 --- a/test/materialized_view/main.go +++ b/test/materialized_view/main.go @@ -137,6 +137,7 @@ func main() { output := flag.String("output", "/workspace/mv-build/sql-results.json", "evidence JSON") n := flag.Int("rows", 1000000, "benchmark source rows") catalogMissing := flag.Bool("catalog-missing", false, "isolated pre-MV kernel fixture only: validate ordinary DDL without catalogs") + consumerCheck := flag.Bool("consumer-check", false, "verify MV native loading, source DELETE and SHOW export consumers") tenantCheck := flag.Bool("tenant-check", false, "run isolated account lifecycle contracts only") functional := flag.Bool("functional", false, "run SQL contracts without performance experiments") keep := flag.Bool("keep", false, "retain test database for restart checks") @@ -181,6 +182,11 @@ func main() { runMissingMaterializedViewCatalog() return } + if *consumerCheck { + evidence.Rows = 0 + runConsumerCases() + return + } if *tenantCheck { tenantIsolationCases(*dsn) return From 14a213e5e497153091d6f312c577ae86e4484013 Mon Sep 17 00:00:00 2001 From: dengn Date: Sun, 18 Oct 2026 22:29:00 +0800 Subject: [PATCH 3/5] fix(mv): rebind cached DELETE after cross-CN dependency creation Treat truncating DELETE eligibility as metadata outside source schema versions. Share the predicate across logical rebuild, physical prepared cache and COM_QUERY admission. Create the regression MV from another session/CN with causal commit handoffs so session DDL invalidation cannot mask the bug. Retain the native failing control and design/cases. Planner/frontend suites (6332 roots), vet/lint, 112-check BVT and final RC/SI cross-CN consumer probes pass; receipt source identities remain explicit. --- .../design/materialized_view_cached_delete.md | 75 ++ ...terialized_view_cached_delete_results.json | 715 ++++++++++++++++++ .../materialized_view_consumer_fixes.md | 11 + docs/design/materialized_view_validation.md | 6 + optools/run_materialized_view_bvt.sh | 2 +- pkg/frontend/computation_wrapper.go | 4 + pkg/frontend/mysql_cmd_executor.go | 5 +- pkg/frontend/prepared_fk_cache_test.go | 22 + pkg/sql/plan/materialized_view.go | 16 + test/materialized_view/README.md | 9 +- test/materialized_view/consumers.go | 35 +- test/materialized_view/main.go | 2 +- 12 files changed, 894 insertions(+), 8 deletions(-) create mode 100644 docs/design/materialized_view_cached_delete.md create mode 100644 docs/design/materialized_view_cached_delete_results.json diff --git a/docs/design/materialized_view_cached_delete.md b/docs/design/materialized_view_cached_delete.md new file mode 100644 index 0000000000000..3b465aadfe8fa --- /dev/null +++ b/docs/design/materialized_view_cached_delete.md @@ -0,0 +1,75 @@ +# Cached DELETE and materialized-view dependencies + +## Requirement and reproducer + +A source DELETE must remain valid row DML after another session creates an MV +that pins its physical identity. MV creation does not change the source schema +version. A previously prepared `CanTruncate` decision therefore cannot establish +that replacement is still legal. + +The native counterexample prepares DELETE on CN1, creates and refreshes an MV on +CN2, then executes the original handle. Before this correction, EXECUTE returns +the dependency rejection and leaves two source rows; a fresh direct DELETE +succeeds with two affected rows. Stored MV rows and publication remain unchanged. +The original same-session test advanced the owner's session DDL generation and +rebuilt its plan, masking this cache boundary. + +```sql +-- Session A, after creating facts and inserting two rows: +PREPARE remove_facts FROM 'DELETE FROM facts'; +-- Session B, same database on another CN: +CREATE MATERIALIZED VIEW stored REFRESH MANUAL AS SELECT id FROM facts; +REFRESH MATERIALIZED VIEW stored; +-- Session A, after the existing synccommit frontier handoff: +EXECUTE remove_facts; -- two affected rows; stored still has its last two rows +``` + +## Ownership and change + +One pure planner predicate recognizes a DELETE query with an actual DELETE node +whose `DeleteCtx.CanTruncate` is true. The existing frontend cache owners use it +to reject ordinary SQL cache admission, avoid retaining a physical prepared +compile, and rebind the prepared logical plan on EXECUTE. Existing rebuild and +compile cleanup publish the resulting generation. The dependency lookup remains +at the physical eligibility owner; there is no second lookup or dependency cache. + +This applies while creation is disabled too: existing MVs still pin identity. +Filtered/row DELETE and ordinary SELECT keep their existing policy. Explicit +TRUNCATE retains its dependency rejection. Once a plan uses row deletion, later +dependency removal does not make that plan unsafe. Existing runtime guards still +protect the physical replacement boundary during concurrent DDL. + +Ordinary SELECT rejects the predicate by statement kind in constant time. +Otherwise eligible unrestricted DELETE pays logical rebinding and its existing +bounded indexed lookup per execution. No new worker, state, retry loop, schema +mutation, per-row work or zero-overhead claim is introduced. No error is recast. + +## Tests and evidence + +| Layer | Oracle | +| --- | --- | +| Frontend policy | Truncating DELETE rebuilds and bypasses both caches; row DELETE, missing context, SELECT and another node retain their policy. All three consumers share the predicate. | +| Native negative/control | Old binary rejects the cross-CN prepared handle while fresh direct DELETE succeeds; two stored rows and the full publication tuple are unchanged. | +| Existing consumer mode | Another session/CN creates and refreshes the MV. EXECUTE returns two affected rows with creation disabled; source is empty, MV rows/publication are intact, unique/secondary maintenance and explicit TRUNCATE protection still hold. | +| Transaction modes | Final consumer and unindexed prepared reproducer pass on two CNs explicitly configured for PESSIMISTIC/RC and OPTIMISTIC/SI. Both services exit0 and all independent cleanup counts are zero in each run. | + +The BVT entrypoint passes its existing second CN to `-consumer-check`. Standalone +use without `-second-dsn` opens another session on the primary endpoint. Existing +`synccommit` handoffs establish cross-CN visibility without sleeps or query retries. +The fixture uses the existing deployment, two rows and indexed source; the +additional connection and prepared handle close before independent30-second +fixture cleanup. + +Complete planner/frontend suites pass (6,332 root passes); focused cache controls, +owning vet and configured incremental lint pass with zero issues. The cache-fix +product binary passes the complete112-check two-CN entrypoint. Two causal SELECT +handoffs were then added only to the consumer harness; final10/10 consumer checks +and the plain reproducer pass in each explicit transaction mode. Product sources +are unchanged across those runs. This distinguishes final harness proof from +the earlier full-entry capture instead of repeating unchanged functional modes. + +[Execution receipts](materialized_view_cached_delete_results.json) retain the +negative, exact terminal results, configurations, cleanup, source fingerprint and +binary identity. The binary is5c25c816 plus working changes with modified=true, +not a pristine publication-head build. Prior crash/upgrade and performance +captures remain historical. New-head CI and reviewer acceptance are separate. diff --git a/docs/design/materialized_view_cached_delete_results.json b/docs/design/materialized_view_cached_delete_results.json new file mode 100644 index 0000000000000..139a20581d787 --- /dev/null +++ b/docs/design/materialized_view_cached_delete_results.json @@ -0,0 +1,715 @@ +{ + "base": "5c25c816824258eb32ce81dbafb1438bf02f819a", + "problem": "cached DELETE prepared on CN1 before CN2 creates an MV retains CanTruncate; same-session DDL generation masked the original test", + "pre_fix": { + "runs": [], + "cleanup": [ + { + "sql": "select count(*) from mo_catalog.mo_database where datname='mv_prepared_boundary'", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_catalog.mo_materialized_views where database_name='mv_prepared_boundary'", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_catalog.mo_mv_dependencies", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_catalog.mo_mv_refresh_runs", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + } + ], + "process_exits": { + "second": 0, + "primary": 0 + }, + "started": 1792332326.2542808, + "protocol_inventory": { + "error": "", + "rows": [ + [ + "{\n \"method\": \"GETPROTOCOLVERSION\",\n \"result\": \"dd1dccb4-4d3c-41f8-b482-5251dc7a41bf:119, ee1dccb4-4d3c-41f8-b482-5251dc7a41bf:119\"\n}\n" + ] + ] + }, + "prepared_boundary": { + "direct_control_affected": 2, + "direct_control_error": "", + "mv_rows": 2, + "prepared_error": "Error 20301 (HY000): invalid input: source has dependent materialized views; drop them before changing its schema/identity", + "publication_after": "1:4b378ed9-b7a6-4eb1-afbe-937758f52edd:1792332344661107865:1", + "publication_before": "1:4b378ed9-b7a6-4eb1-afbe-937758f52edd:1792332344661107865:1", + "remaining": 2 + }, + "elapsed": 20.673641204833984 + }, + "pre_fix_source_limit": "e97 candidate binary; affected cache owners are byte-identical to5c25, not represented as a pristine5c25 binary", + "unit": { + "focused": { + "packages": [ + { + "Time": "2026-10-18T14:13:54.810943933Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/frontend", + "Elapsed": 1.091 + } + ], + "root_passes": 2, + "cases": [ + { + "Time": "2026-10-18T14:13:54.805047198Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/frontend", + "Test": "TestShouldCachePrepareCompileForeignKeyActions", + "Elapsed": 0 + }, + { + "Time": "2026-10-18T14:13:54.805322637Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/frontend", + "Test": "TestMaterializedViewDeletePlanCachePolicy/truncating_delete", + "Elapsed": 0 + }, + { + "Time": "2026-10-18T14:13:54.805649598Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/frontend", + "Test": "TestMaterializedViewDeletePlanCachePolicy/row_delete", + "Elapsed": 0 + }, + { + "Time": "2026-10-18T14:13:54.805758768Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/frontend", + "Test": "TestMaterializedViewDeletePlanCachePolicy/missing_delete_context", + "Elapsed": 0 + }, + { + "Time": "2026-10-18T14:13:54.805820267Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/frontend", + "Test": "TestMaterializedViewDeletePlanCachePolicy/ordinary_select", + "Elapsed": 0 + }, + { + "Time": "2026-10-18T14:13:54.805905069Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/frontend", + "Test": "TestMaterializedViewDeletePlanCachePolicy/other_node", + "Elapsed": 0 + }, + { + "Time": "2026-10-18T14:13:54.805913854Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/frontend", + "Test": "TestMaterializedViewDeletePlanCachePolicy", + "Elapsed": 0 + } + ] + }, + "owning": { + "packages": [ + { + "Time": "2026-10-18T14:15:59.653941238Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/sql/plan", + "Elapsed": 23.131 + }, + { + "Time": "2026-10-18T14:16:29.456023842Z", + "Action": "pass", + "Package": "github.com/matrixorigin/matrixone/pkg/frontend", + "Elapsed": 17.149 + } + ], + "root_passes": 6332 + } + }, + "static": { + "owning_vet_all": "PASS exit0", + "incremental_lint": "PASS exit0,0 issues; golangci-lint2.14.0/Go1.27.1, plan/frontend/client", + "final_client_vet": "PASS exit0", + "final_client_lint": "PASS exit0,0 issues after adding causal handoffs", + "format_shell_diff": "PASS" + }, + "full_native": { + "runs": [ + { + "run": 1, + "exit": 0, + "elapsed": 212.29324589700263, + "entry_sha256": "c1d47f1c7f61aad21f23c1cc1e4a332bcd580e84a6380f200b23bb130d3637c4", + "modes": { + "functional": { + "experiments": null, + "started": "2026-10-18T14:17:21.231485225Z", + "passed_cases": [ + "experimental gate", + "deferred population", + "NULL and aggregate semantics", + "independent typed aggregate oracle", + "last committed materialization", + "insert update delete refresh", + "read only: insert into totals(k) values(4)", + "read only: update totals set k=4", + "read only: delete from totals", + "read only: truncate table totals", + "read only: replace into totals(k) values(4)", + "read only: alter table totals add x int", + "read only: drop table totals", + "dependency restrict: alter table facts add x int", + "dependency restrict: truncate table facts", + "dependency restrict: drop table facts", + "dependency restrict: drop database mv_validation", + "failed DROP preserves current database", + "unsupported definition: select rand() from facts", + "unsupported definition: select now() from facts", + "unsupported definition: select distinct k from facts", + "unsupported definition: select count(distinct k) from facts", + "unsupported definition: select * from facts limit 1", + "unsupported definition: select row_number() over(order by id) from facts", + "unsupported definition: select * from totals", + "inner join refresh", + "empty aggregate", + "refresh in user transaction", + "SHOW CREATE", + "scheduled refresh", + "SHOW state and full source timestamp", + "refresh history", + "repeat refresh idempotent rows", + "IF NOT EXISTS no replacement", + "object kind collision", + "duplicate output heading", + "minimum schedule interval", + "MV nesting", + "outer join", + "random sample", + "temporary source", + "grouped empty has zero rows", + "all NULL typed oracle", + "projection and filter", + "dimension mutation", + "captured SQL mode", + "captured context with escaped source identity", + "captured fixed-offset timezone", + "create MV in user transaction", + "rename dependent source", + "foreign key into MV", + "prepared read after refresh", + "concurrent readers see complete publications", + "concurrent refresh publication", + "MV grant requires source SELECT", + "MV plus source grant permits read", + "prepared source ACL revocation", + "nonowner refresh rejected", + "nonowner drop rejected", + "SHOW owner isolation", + "scheduled refresh blocked for suspend account preserves rows and provenance", + "scheduled refresh resumes after reopening suspend account", + "scheduled refresh blocked for restricted account preserves rows and provenance", + "scheduled refresh resumes after reopening restricted account", + "same-name multi-tenant source and MV isolation", + "tenant DROP DATABASE restricts surviving MVs", + "DROP ACCOUNT failure rolls back retired objects, policy and metadata", + "DROP ACCOUNT retires surviving populated and periodic MVs", + "cancelled client read", + "drop cleanup" + ], + "source_rows": 0, + "refresh_ms": 0, + "baseline_ms": null, + "materialized_ms": null, + "median_speedup": 0, + "raw_plan": null, + "materialized_plan": null, + "materialized_rows": 0 + }, + "failure": { + "experiments": null, + "started": "2026-10-18T14:20:49.623313075Z", + "passed_cases": [ + "native source-expression refresh failure", + "native failed refresh preserves rows", + "native failed refresh diagnostic", + "drop removes MV state", + "dependency cleanup permits database drop" + ], + "source_rows": 1000000, + "refresh_ms": 0, + "baseline_ms": null, + "materialized_ms": null, + "median_speedup": 0, + "raw_plan": null, + "materialized_plan": null, + "materialized_rows": 0 + }, + "consumers": { + "experiments": null, + "started": "2026-10-18T14:20:49.86299717Z", + "passed_cases": [ + "prepared unrestricted source DELETE preserves MV publication", + "source DELETE maintains secondary and unique indexes", + "explicit source TRUNCATE remains protected", + "ALTER COPY rejects dependent source without preparation residue", + "direct unrestricted source DELETE keeps dependency identity", + "empty dependent source DELETE returns zero affected rows", + "MV rejected at native boundary: dump table stored to ", + "MV rejected at native boundary: load table stored from ", + "SHOW CREATE TABLE round-trips a manual MV", + "SHOW CREATE TABLE exports the authoritative altered refresh policy" + ], + "source_rows": 0, + "refresh_ms": 0, + "baseline_ms": null, + "materialized_ms": null, + "median_speedup": 0, + "raw_plan": null, + "materialized_plan": null, + "materialized_rows": 0 + }, + "multi-cn": { + "experiments": null, + "started": "2026-10-18T14:20:50.433882939Z", + "passed_cases": [ + "second CN rejects unpopulated view", + "cross-CN publication visibility", + "second CN can refresh independently", + "two-CN concurrent publication version 2", + "two-CN concurrent publication version 3", + "two-CN concurrent publication version 4", + "two-CN concurrent publication version 5", + "two-CN concurrent publication version 6", + "cross-CN terminal history" + ], + "source_rows": 4, + "refresh_ms": 0, + "baseline_ms": null, + "materialized_ms": null, + "median_speedup": 0, + "raw_plan": null, + "materialized_plan": null, + "materialized_rows": 0 + }, + "native-probe": { + "runs": [ + { + "passed_requests": 9, + "process_exit": 0 + }, + { + "passed_requests": 9, + "process_exit": 0 + } + ] + } + } + } + ], + "cleanup": [ + [ + { + "sql": "select count(*) from mo_catalog.mo_database where datname in ('mv_validation','mv_validation_multi_cn','mv_consumer_validation')", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_catalog.mo_materialized_views where database_name like 'mv_%'", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_catalog.mo_mv_dependencies", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_catalog.mo_mv_refresh_runs", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_task.sys_async_task where task_metadata_id like 'mv:%'", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + } + ] + ], + "process_exits": { + "second": 0, + "primary": 0 + }, + "started": 1792333019.752922, + "protocol_inventory": { + "error": "", + "rows": [ + [ + "{\n \"method\": \"GETPROTOCOLVERSION\",\n \"result\": \"ee1dccb4-4d3c-41f8-b482-5251dc7a41bf:119, dd1dccb4-4d3c-41f8-b482-5251dc7a41bf:119\"\n}\n" + ] + ] + }, + "plain_prepared_boundary": { + "affected": 2, + "mv_rows": 2, + "prepared_error": "", + "publication_after": "1:076c17cc-9ceb-4c45-b267-83f2152f02d2:1792333037498058865:1", + "publication_before": "1:076c17cc-9ceb-4c45-b267-83f2152f02d2:1792333037498058865:1", + "remaining": 0 + }, + "consumer_smoke": { + "experiments": null, + "started": "2026-10-18T14:17:17.881090244Z", + "passed_cases": [ + "prepared unrestricted source DELETE preserves MV publication", + "source DELETE maintains secondary and unique indexes", + "explicit source TRUNCATE remains protected", + "ALTER COPY rejects dependent source without preparation residue", + "direct unrestricted source DELETE keeps dependency identity", + "empty dependent source DELETE returns zero affected rows", + "MV rejected at native boundary: dump table stored to ", + "MV rejected at native boundary: load table stored from ", + "SHOW CREATE TABLE round-trips a manual MV", + "SHOW CREATE TABLE exports the authoritative altered refresh policy" + ], + "source_rows": 0, + "refresh_ms": 0, + "baseline_ms": null, + "materialized_ms": null, + "median_speedup": 0, + "raw_plan": null, + "materialized_plan": null, + "materialized_rows": 0 + }, + "elapsed": 254.6159873008728 + }, + "full_native_assertions": 112, + "full_native_scope": "cache-fix product binary and cross-CN consumer; precedes addition of two explicit synccommit SELECT handoffs to final consumer harness; no product source changed afterward", + "final_native_modes": { + "PESSIMISTIC/RC": { + "configs": { + "cn": { + "mode": "pessimistic", + "isolation": "RC" + }, + "cn2": { + "mode": "pessimistic", + "isolation": "RC" + } + }, + "results": { + "runs": [], + "cleanup": [ + { + "sql": "select count(*) from mo_catalog.mo_database where datname in ('mv_consumer_validation','mv_prepared_boundary')", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_catalog.mo_materialized_views where database_name like 'mv_%'", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_catalog.mo_mv_dependencies", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_catalog.mo_mv_refresh_runs", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_task.sys_async_task where task_metadata_id like 'mv:%'", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + } + ], + "process_exits": { + "second": 0, + "primary": 0 + }, + "started": 1792333363.6896417, + "protocol_inventory": { + "error": "", + "rows": [ + [ + "{\n \"method\": \"GETPROTOCOLVERSION\",\n \"result\": \"dd1dccb4-4d3c-41f8-b482-5251dc7a41bf:119, ee1dccb4-4d3c-41f8-b482-5251dc7a41bf:119\"\n}\n" + ] + ] + }, + "plain_prepared_boundary": { + "affected": 2, + "mv_rows": 2, + "prepared_error": "", + "publication_after": "1:1dab074b-500b-42f3-9b89-311df64957fa:1792333380916610719:1", + "publication_before": "1:1dab074b-500b-42f3-9b89-311df64957fa:1792333380916610719:1", + "remaining": 0 + }, + "consumer_smoke": { + "experiments": null, + "started": "2026-10-18T14:23:01.071799109Z", + "passed_cases": [ + "prepared unrestricted source DELETE preserves MV publication", + "source DELETE maintains secondary and unique indexes", + "explicit source TRUNCATE remains protected", + "ALTER COPY rejects dependent source without preparation residue", + "direct unrestricted source DELETE keeps dependency identity", + "empty dependent source DELETE returns zero affected rows", + "MV rejected at native boundary: dump table stored to ", + "MV rejected at native boundary: load table stored from ", + "SHOW CREATE TABLE round-trips a manual MV", + "SHOW CREATE TABLE exports the authoritative altered refresh policy" + ], + "source_rows": 0, + "refresh_ms": 0, + "baseline_ms": null, + "materialized_ms": null, + "median_speedup": 0, + "raw_plan": null, + "materialized_plan": null, + "materialized_rows": 0 + }, + "elapsed": 19.6884822845459 + } + }, + "OPTIMISTIC/SI": { + "configs": { + "cn": { + "mode": "optimistic", + "isolation": "SI" + }, + "cn2": { + "mode": "optimistic", + "isolation": "SI" + } + }, + "results": { + "runs": [], + "cleanup": [ + { + "sql": "select count(*) from mo_catalog.mo_database where datname in ('mv_consumer_validation','mv_prepared_boundary')", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_catalog.mo_materialized_views where database_name like 'mv_%'", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_catalog.mo_mv_dependencies", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_catalog.mo_mv_refresh_runs", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + }, + { + "sql": "select count(*) from mo_task.sys_async_task where task_metadata_id like 'mv:%'", + "response": { + "error": "", + "rows": [ + [ + "0" + ] + ] + } + } + ], + "process_exits": { + "second": 0, + "primary": 0 + }, + "started": 1792333383.4250107, + "protocol_inventory": { + "error": "", + "rows": [ + [ + "{\n \"method\": \"GETPROTOCOLVERSION\",\n \"result\": \"ee1dccb4-4d3c-41f8-b482-5251dc7a41bf:119, dd1dccb4-4d3c-41f8-b482-5251dc7a41bf:119\"\n}\n" + ] + ] + }, + "plain_prepared_boundary": { + "affected": 2, + "mv_rows": 2, + "prepared_error": "", + "publication_after": "1:d34c8302-6e7d-4bcf-aec2-d7ad4b97b15d:1792333401684663023:1", + "publication_before": "1:d34c8302-6e7d-4bcf-aec2-d7ad4b97b15d:1792333401684663023:1", + "remaining": 0 + }, + "consumer_smoke": { + "experiments": null, + "started": "2026-10-18T14:23:21.848384998Z", + "passed_cases": [ + "prepared unrestricted source DELETE preserves MV publication", + "source DELETE maintains secondary and unique indexes", + "explicit source TRUNCATE remains protected", + "ALTER COPY rejects dependent source without preparation residue", + "direct unrestricted source DELETE keeps dependency identity", + "empty dependent source DELETE returns zero affected rows", + "MV rejected at native boundary: dump table stored to ", + "MV rejected at native boundary: load table stored from ", + "SHOW CREATE TABLE round-trips a manual MV", + "SHOW CREATE TABLE exports the authoritative altered refresh policy" + ], + "source_rows": 0, + "refresh_ms": 0, + "baseline_ms": null, + "materialized_ms": null, + "median_speedup": 0, + "raw_plan": null, + "materialized_plan": null, + "materialized_rows": 0 + }, + "elapsed": 20.72763991355896 + } + } + }, + "final_native_scope": "final consumer with causal commit handoffs plus unindexed cross-CN PREPARE reproducer, each on2 CNs configured explicitly for recorded mode", + "delivery_inputs": { + "base": "5c25c816824258eb32ce81dbafb1438bf02f819a", + "count": 11214, + "sha256": "de70fcd28d5d981f894693699dacb8d89c4cb6d9898e750b572930c7467d1bff" + }, + "binary": { + "sha256": "ba3e8e063f2bd3e842990ff5627a3c20e2cbd426736180279ed0151ed459722c", + "bytes": 274961984, + "buildinfo": [ + "\tbuild\tCGO_ENABLED=1", + "\tbuild\tGOEXPERIMENT=simd", + "\tbuild\tGOAMD64=v3", + "\tbuild\tvcs.revision=5c25c816824258eb32ce81dbafb1438bf02f819a", + "\tbuild\tvcs.time=2026-10-18T13:23:29Z", + "\tbuild\tvcs.modified=true" + ], + "scope": "5c25+cache-owner fix; vcs.modified=true; later final edits affect only client test synchronization and README" + }, + "not_claimed": [ + "new-head CI success", + "new crash/upgrade run", + "new performance/speedup benchmark" + ], + "self_review": { + "decision": "no known source blockers", + "owner": "existing frontend logical/physical plan-cache admission and rebuild", + "resource": "pure bounded metadata predicate; no new I/O/cache/worker/retry/state; second native connection closes before independent fixture cleanup", + "cost": "SELECT rejects predicate by statement kind inO(1); eligible truncating DELETE is rebound per EXECUTE and performs its existing bounded dependency lookup; no zero-overhead claim", + "race": "database metadata interleaving controlled by separate sessions/CNs and commit frontier handoff; no new Go shared-memory synchronization" + } +} diff --git a/docs/design/materialized_view_consumer_fixes.md b/docs/design/materialized_view_consumer_fixes.md index 092486e8d8f17..ec3419fe7385f 100644 --- a/docs/design/materialized_view_consumer_fixes.md +++ b/docs/design/materialized_view_consumer_fixes.md @@ -128,3 +128,14 @@ processes exit0, all five independent metadata/task cleanup queries return zero. The11,214-file tracked input map outside `docs/` is unchanged after execution; canonical SHA256 is `928d2d01820842e8100fac336eac67ebb12854fd7513fecfefe587691df4fd4d`. See [integration receipts](materialized_view_copy_integration_results.json). + +## Cross-CN prepared DELETE cache follow-up + +Further native validation found that the same-session prepared case was masked +by the session DDL generation. A handle prepared on CN1 before CN2 creates an MV +retained its truncate eligibility and rejected valid DELETE; direct DELETE worked. +The cache owners now rebind that metadata-dependent decision. The consumer mode +uses another session/CN and causal commit handoffs. See the [cache requirement, +design and cases](materialized_view_cached_delete.md) and [paired native/unit +receipts](materialized_view_cached_delete_results.json). Allocations, refresh +publication and task ownership are unchanged. diff --git a/docs/design/materialized_view_validation.md b/docs/design/materialized_view_validation.md index 40eb62cb63f05..ebc499591e42b 100644 --- a/docs/design/materialized_view_validation.md +++ b/docs/design/materialized_view_validation.md @@ -321,3 +321,9 @@ mode includes prepared-before-creation and feature-disabled DELETE, affected-row boundaries, unique/secondary controls, unchanged publication, native import rejection and manual/altered-policy DDL replay. See [consumer corrections](materialized_view_consumer_fixes.md) and its evidence JSON. +## Additional cross-CN cache boundary + +Prepare source DELETE on one CN, create/refresh its MV on another, then EXECUTE +without changing the prepared owner's DDL generation. Require row deletion, +unchanged last-good MV rows/full publication and zero fixture residue in RC and +SI. [Requirement, design, controls and execution receipts](materialized_view_cached_delete.md). diff --git a/optools/run_materialized_view_bvt.sh b/optools/run_materialized_view_bvt.sh index 356155b88a06a..a091abcd58de0 100644 --- a/optools/run_materialized_view_bvt.sh +++ b/optools/run_materialized_view_bvt.sh @@ -43,7 +43,7 @@ python3 "${repo_root}/test/materialized_view/native_probe/check.py" \ -output "${report_dir}/functional.json" "${build_dir}/mv-validation" -dsn "${primary_dsn}" -edge-check \ -output "${report_dir}/failure.json" -"${build_dir}/mv-validation" -dsn "${primary_dsn}" -consumer-check \ +"${build_dir}/mv-validation" -dsn "${primary_dsn}" -consumer-check -second-dsn "${second_dsn}" \ -output "${report_dir}/consumers.json" "${build_dir}/mv-validation" -dsn "${primary_dsn}" -second-dsn "${second_dsn}" \ -output "${report_dir}/multi-cn.json" diff --git a/pkg/frontend/computation_wrapper.go b/pkg/frontend/computation_wrapper.go index 02cadba21e144..059dd426f1995 100644 --- a/pkg/frontend/computation_wrapper.go +++ b/pkg/frontend/computation_wrapper.go @@ -2658,6 +2658,9 @@ func shouldCachePrepareCompile(p *plan.Plan) bool { if p == nil { return true } + if plan2.PreparedPlanDependsOnMaterializedViewDependencies(p) { + return false + } if plan2.PreparedPlanHasPercentileParams(p) { // The percentile marker is evaluated while the physical aggregate is // constructed and becomes immutable executor configuration. Reusing that @@ -2704,6 +2707,7 @@ func shouldRebuildPreparePlan(schemaChanged bool, p *plan.Plan) bool { query := p.GetQuery() return query != nil && (query.GetHasForeignKeyAction() || query.GetViewMetadataDependsOnUdf() || + plan2.PreparedPlanDependsOnMaterializedViewDependencies(p) || plan2.PreparedPlanDependsOnSubscriptionMetadata(p) || plan2.PreparedPlanDependsOnIndexCoverage(p)) } diff --git a/pkg/frontend/mysql_cmd_executor.go b/pkg/frontend/mysql_cmd_executor.go index 8485856428d27..0112fa074980d 100644 --- a/pkg/frontend/mysql_cmd_executor.go +++ b/pkg/frontend/mysql_cmd_executor.go @@ -6941,7 +6941,10 @@ func checkNodeCanCache(p *plan2.Plan) bool { // otherwise reject it. Do not admit any plan with this dependency to the // ordinary COM_QUERY cache: creating the first subscription does not change // a table schema version and therefore cannot invalidate such a cached plan. - if plan2.PreparedPlanDependsOnSubscriptionMetadata(p) { + // Truncating DELETE also depends on reverse MV dependencies outside the + // source schema version. Its eligibility must be rebound for each statement. + if plan2.PreparedPlanDependsOnSubscriptionMetadata(p) || + plan2.PreparedPlanDependsOnMaterializedViewDependencies(p) { return false } if q, ok := p.Plan.(*plan2.Plan_Query); ok { diff --git a/pkg/frontend/prepared_fk_cache_test.go b/pkg/frontend/prepared_fk_cache_test.go index 6e60990441607..1a745062c79a9 100644 --- a/pkg/frontend/prepared_fk_cache_test.go +++ b/pkg/frontend/prepared_fk_cache_test.go @@ -58,6 +58,28 @@ func TestShouldCachePrepareCompileForeignKeyActions(t *testing.T) { require.False(t, checkNodeCanCache(subscriptionMetadataPlan)) } +func TestMaterializedViewDeletePlanCachePolicy(t *testing.T) { + for _, tc := range []struct { + name string + stmt plan.Query_StatementType + node *plan.Node + rebind bool + }{ + {"truncating delete", plan.Query_DELETE, &plan.Node{NodeType: plan.Node_DELETE, DeleteCtx: &plan.DeleteCtx{CanTruncate: true}}, true}, + {"row delete", plan.Query_DELETE, &plan.Node{NodeType: plan.Node_DELETE, DeleteCtx: &plan.DeleteCtx{}}, false}, + {"missing delete context", plan.Query_DELETE, &plan.Node{NodeType: plan.Node_DELETE}, false}, + {"ordinary select", plan.Query_SELECT, &plan.Node{NodeType: plan.Node_TABLE_SCAN}, false}, + {"other node", plan.Query_DELETE, &plan.Node{NodeType: plan.Node_PROJECT, DeleteCtx: &plan.DeleteCtx{CanTruncate: true}}, false}, + } { + t.Run(tc.name, func(t *testing.T) { + p := &plan.Plan{Plan: &plan.Plan_Query{Query: &plan.Query{StmtType: tc.stmt, Nodes: []*plan.Node{tc.node}}}} + require.Equal(t, tc.rebind, shouldRebuildPreparePlan(false, p)) + require.Equal(t, !tc.rebind, shouldCachePrepareCompile(p)) + require.Equal(t, !tc.rebind, checkNodeCanCache(p)) + }) + } +} + func TestInitExecuteStmtParamRebuildsAcrossForeignKeyChecksTransitions(t *testing.T) { for i, test := range []struct { name string diff --git a/pkg/sql/plan/materialized_view.go b/pkg/sql/plan/materialized_view.go index bf7c5d0ff5129..7968c1d7d3ce9 100644 --- a/pkg/sql/plan/materialized_view.go +++ b/pkg/sql/plan/materialized_view.go @@ -34,6 +34,22 @@ import ( "github.com/matrixorigin/matrixone/pkg/vm/process" ) +// PreparedPlanDependsOnMaterializedViewDependencies identifies a destructive +// DELETE optimization whose eligibility is not captured by table schema versions. +// Another session can create an MV without changing the source definition. +func PreparedPlanDependsOnMaterializedViewDependencies(p *Plan) bool { + q := p.GetQuery() + if q == nil || q.GetStmtType() != pb.Query_DELETE { + return false + } + for _, node := range q.GetNodes() { + if node.GetNodeType() == pb.Node_DELETE && node.GetDeleteCtx().GetCanTruncate() { + return true + } + } + return false +} + // ValidateMaterializedViewSelect is a bounded definition-time AST check. This // deliberately admits a smaller language than ordinary SELECT in the first release. func ValidateMaterializedViewSelect(ctx CompilerContext, stmt *tree.Select) error { diff --git a/test/materialized_view/README.md b/test/materialized_view/README.md index 5f714cc87ab40..61b8cf70079db 100644 --- a/test/materialized_view/README.md +++ b/test/materialized_view/README.md @@ -157,10 +157,17 @@ and cleans its own database. Validate both transaction modes by configuring `-consumer-check` selects the native consumer regressions for review5562448876. It reuses the existing authenticated BVT service and owns a two-row indexed source, manual MVs and one altered periodic policy. Ten checks cover prepared -DELETE before MV creation, unrestricted DELETE with creation disabled, affected +DELETE before MV creation in a different session/CN, unrestricted DELETE with creation disabled, affected rows including an empty source, unique/secondary maintenance, explicit TRUNCATE protection and ALTER COPY rejection without preparation residue, DUMP/LOAD kind admission before file access with unchanged publication, and SHOW CREATE TABLE equality/replay for manual and altered periodic policies. The fixture drops its MVs before its database on both success and failure. The normal BVT entrypoint includes the mode and requires a nonempty successful JSON report, using the same deployment and coverage path. + +The consumer mode accepts `-second-dsn` for the MV-creating connection; without +it, it opens a second session on the primary endpoint. The BVT entrypoint uses +the second CN. Creating the MV on the prepared statement's own session would +advance its DDL generation and mask stale truncate eligibility. Truncating +DELETE plans now bypass ordinary and physical prepared caches and rebind on +EXECUTE; filtered/row DELETE and ordinary SELECT retain their existing policy. diff --git a/test/materialized_view/consumers.go b/test/materialized_view/consumers.go index b23e40217b9ee..0a846e7edb773 100644 --- a/test/materialized_view/consumers.go +++ b/test/materialized_view/consumers.go @@ -20,9 +20,11 @@ import ( "reflect" "strings" "time" + + mysql "github.com/go-sql-driver/mysql" ) -func runConsumerCases() { +func runConsumerCases(dsn, secondDSN string) { db.SetMaxOpenConns(1) exec("create database mv_consumer_validation") defer func() { @@ -52,15 +54,40 @@ func runConsumerCases() { exec("create table facts(id int primary key,k int unique,skey int,index sk(skey))") const insert = "insert into facts values(1,11,10),(2,22,20)" exec(insert) + if secondDSN == "" { + secondDSN = dsn + } + config, err := mysql.ParseDSN(secondDSN) + if err != nil { + panic(err) + } + config.DBName = "mv_consumer_validation" + other, err := openConfigured(config) + if err != nil { + panic(err) + } + defer other.Close() + other.SetMaxOpenConns(1) + otherExec := func(sql string) { + if _, err := other.ExecContext(ctx, sql); err != nil { + panic(err) + } + } + otherExec("set experimental_materialized_view=1") + otherExec("set time_zone='+00:00'") // This statement predates dependency creation: cached eligibility must not - // turn valid source DML into a rejected physical-identity replacement. + // turn valid source DML into a rejected physical-identity replacement. Use + // another session/CN so the owner's session DDL generation cannot mask it. prepared, err := db.PrepareContext(ctx, "delete from facts") if err != nil { panic(err) } defer prepared.Close() - exec("create materialized view stored refresh manual as select id,k,skey from facts") - exec("refresh materialized view stored") + // Cross-CN assertions use the existing causal commit-frontier handoff. + rows("select mo_ctl('cn','synccommit','')") + otherExec("create materialized view stored refresh manual as select id,k,skey from facts") + otherExec("refresh materialized view stored") + rows("select mo_ctl('cn','synccommit','')") const publication = "select successful_sequence,last_run,source_physical,source_logical from mo_catalog.mo_materialized_views where account_id=0 and database_name='mv_consumer_validation' and name='stored'" before := rows(publication) exec("set experimental_materialized_view=0") diff --git a/test/materialized_view/main.go b/test/materialized_view/main.go index c38cedaf4f996..7bcb5966b9711 100644 --- a/test/materialized_view/main.go +++ b/test/materialized_view/main.go @@ -184,7 +184,7 @@ func main() { } if *consumerCheck { evidence.Rows = 0 - runConsumerCases() + runConsumerCases(*dsn, *secondDSN) return } if *tenantCheck { From 50e7f92bd08e6ba0491d8c63368f8720f874d9f5 Mon Sep 17 00:00:00 2001 From: dengn Date: Mon, 19 Oct 2026 03:12:22 +0800 Subject: [PATCH 4/5] test: synchronize cross-CN view metadata checks after restore --- docs/design/materialized_view_ci_triage.md | 30 +++ ...ized_view_cross_cn_visibility_results.json | 215 ++++++++++++++++++ docs/design/materialized_view_validation.md | 10 + .../multicn/view_description_test.go | 13 +- 4 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 docs/design/materialized_view_cross_cn_visibility_results.json diff --git a/docs/design/materialized_view_ci_triage.md b/docs/design/materialized_view_ci_triage.md index 8c346cf4a43a9..e9a19ac271e86 100644 --- a/docs/design/materialized_view_ci_triage.md +++ b/docs/design/materialized_view_ci_triage.md @@ -941,3 +941,33 @@ The combined EXPLAIN consumer suite also passes (0.326 s), with its own vet and configured incremental lint reporting zero issues. This closes the additional auto-merged test consumer without changing source or existing semantic input fingerprints. + + +## Coverage UT: cross-CN View description after source restore + +Run [39152640600](https://github.com/matrixorigin/matrixone/actions/runs/39152640600), +head `3b4328cca234b829458a529e9a5eccb2dda97e89`, failed job +`117749332951` (`UT Coverage on Ubuntu/x86`, Linux/amd64, Go 1.27.1). +The retained diagnostic artifact `12146677048` identifies one failing test: +`pkg/tests/sqlintegration/multicn/TestViewDescriptionTwoCN`. After CN0 restored +only the source table, CN1's existing prepared SHOW COLUMNS returned +`varchar(90)` where the test expected the restored `varchar(60)`. The normal UT, +SCA, shared build, both BVTs, Iceberg and Connector/J passed on this head; +coverage UT and consequently CI Required failed. + +The fixture used Push mode without transferring the writer's commit frontier +before asserting freshness on the peer. Complete the cross-CN visibility +precondition with the existing `mo_ctl('cn','synccommit','')` command, including +ordinary metadata checks. After RESTORE, independently assert that CN1 sees the +new physical source ID before executing the **same** prepared handle. A SELECT +does not advance that session's DDL generation. Keep all literal type/value, +physical replacement, stable View identity, CTAS and restart assertions; add no +sleep, retry, reprepare or weaker expected result. No production source or CI +policy changes are required by this correction. A local isolated run of the +original test passed, so this does not claim a clean-main reproduction. + +The [scoped result ledger](materialized_view_cross_cn_visibility_results.json) +records dependency-instrumented focused runs, the normal owning package, +static checks and the cache counterexample. The protocol-120 production/native +proof remains in its existing ledger because its product sources are unchanged. +New-head remote CI remains a separate gate. diff --git a/docs/design/materialized_view_cross_cn_visibility_results.json b/docs/design/materialized_view_cross_cn_visibility_results.json new file mode 100644 index 0000000000000..1f4cc810fef73 --- /dev/null +++ b/docs/design/materialized_view_cross_cn_visibility_results.json @@ -0,0 +1,215 @@ +{ + "parent": "3b4328cca234b829458a529e9a5eccb2dda97e89", + "scope": "test fixture and documentation only; all production source blobs unchanged", + "failure": { + "run": 39152640600, + "job": 117749332951, + "artifact": 12146677048, + "platform": "linux/amd64", + "go": "1.27.1", + "test": "TestViewDescriptionTwoCN", + "expected": "varchar(60)", + "actual": "varchar(90)", + "failed_root_tests": 1, + "clean_main_reproduction": false + }, + "contract": { + "visibility": "explicit cross-CN synccommit before peer freshness assertions", + "restore_oracle": "peer source ID equals restored writer ID and differs from original source ID", + "prepared_oracle": "same prepared handle returns varchar(60), no peer DDL/reprepare after restore", + "preserved": [ + "literal widths/data", + "nested View descriptions", + "information_schema", + "CTAS", + "stable View identity", + "same-binary restart" + ], + "no_sleeps_or_retries": true + }, + "coverage_mode": { + "tags": "matrixone_test", + "short": true, + "p": 1, + "covermode": "set", + "coverpkg": [ + "./pkg/frontend", + "./pkg/sql/plan", + "./pkg/sql/compile", + "./pkg/vm/engine/disttae", + "./pkg/cnservice", + "./pkg/txn/client" + ], + "not_full_ci_instrumentation": true + }, + "focused": { + "receipt": "oct18-view-description-causal-coverage.jsonl", + "sha256": "f7e45bf81705041769c3a0061adc3ac333bb39e85c024450f66b73d2d4d6a911", + "terminal": [ + { + "Package": "github.com/matrixorigin/matrixone/pkg/tests/sqlintegration/multicn", + "Action": "pass", + "Elapsed": 9.171 + } + ], + "root_tests": [ + { + "Test": "TestViewDescriptionTwoCN", + "Action": "pass", + "Elapsed": 8.71 + } + ] + }, + "repeated_10": { + "receipt": "oct18-view-description-causal-stress.jsonl", + "sha256": "aad13bbb943663213c02cf57529ceb292fe6670aa5841b93fe7447c48a3c2c5c", + "terminal": [ + { + "Package": "github.com/matrixorigin/matrixone/pkg/tests/sqlintegration/multicn", + "Action": "pass", + "Elapsed": 93.544 + } + ], + "root_tests": [ + { + "Test": "TestViewDescriptionTwoCN", + "Action": "pass", + "Elapsed": 9.6 + }, + { + "Test": "TestViewDescriptionTwoCN", + "Action": "pass", + "Elapsed": 8.72 + }, + { + "Test": "TestViewDescriptionTwoCN", + "Action": "pass", + "Elapsed": 8.49 + }, + { + "Test": "TestViewDescriptionTwoCN", + "Action": "pass", + "Elapsed": 7.52 + }, + { + "Test": "TestViewDescriptionTwoCN", + "Action": "pass", + "Elapsed": 8.56 + }, + { + "Test": "TestViewDescriptionTwoCN", + "Action": "pass", + "Elapsed": 8.33 + }, + { + "Test": "TestViewDescriptionTwoCN", + "Action": "pass", + "Elapsed": 8.77 + }, + { + "Test": "TestViewDescriptionTwoCN", + "Action": "pass", + "Elapsed": 16.59 + }, + { + "Test": "TestViewDescriptionTwoCN", + "Action": "pass", + "Elapsed": 8.21 + }, + { + "Test": "TestViewDescriptionTwoCN", + "Action": "pass", + "Elapsed": 8.5 + } + ] + }, + "owning_normal": { + "receipt": "oct18-view-description-owning.jsonl", + "sha256": "0eb62e54e074d96e6386e8f26367af7162a82ec7d16041f19be3062e2fbf7ac0", + "terminal": [ + { + "Package": "github.com/matrixorigin/matrixone/pkg/tests/sqlintegration/multicn", + "Action": "pass", + "Elapsed": 37.77 + } + ], + "root_tests": [ + { + "Test": "TestDatabaseDefaultsTwoCNPreparedFreshness", + "Action": "pass", + "Elapsed": 5.99 + }, + { + "Test": "TestIssue29566IndexRebuildCoordinator", + "Action": "pass", + "Elapsed": 8.15 + }, + { + "Test": "TestIndexSearchScanRefusesOlderCN", + "Action": "pass", + "Elapsed": 6.51 + }, + { + "Test": "TestJoinCoordinatorStage", + "Action": "pass", + "Elapsed": 7.5 + }, + { + "Test": "TestViewDescriptionTwoCN", + "Action": "pass", + "Elapsed": 9.44 + } + ] + }, + "static": { + "vet": 0, + "lint": 0 + }, + "counterexample_limits": { + "disable_validateCapturedPrepareSchemas_check": { + "receipt": "oct18-view-description-schema-counterexample.jsonl", + "sha256": "ca5df82ba5bfe13b02584129d605d1df9035c8fb19d109057147dd7d04a722f4", + "terminal": [ + { + "Package": "github.com/matrixorigin/matrixone/pkg/tests/sqlintegration/multicn", + "Action": "pass", + "Elapsed": 49.201 + } + ], + "root_tests": [ + { + "Test": "TestViewDescriptionTwoCN", + "Action": "pass", + "Elapsed": 49.03 + } + ] + }, + "omit_Show_source_dependency_append": { + "receipt": "oct18-view-description-source-counterexample.jsonl", + "sha256": "cb3bfacb1c9590342e5f077cc268614c9f5bcfa4aea03e71e7f3a97082ffa3a6", + "terminal": [ + { + "Package": "github.com/matrixorigin/matrixone/pkg/tests/sqlintegration/multicn", + "Action": "pass", + "Elapsed": 9.317 + } + ], + "root_tests": [ + { + "Test": "TestViewDescriptionTwoCN", + "Action": "pass", + "Elapsed": 9.11 + } + ] + }, + "interpretation": "Both isolated overlays still pass: redundant cache validation/rebuild paths remain. Neither establishes single-guard mutation sensitivity; these are inconclusive probes, not negative-control passes. No overlay is included in delivery." + }, + "evidence_reuse": { + "production": "all production source blobs identical to parent", + "native": "protocol120 ledger: 116 per RC/SI mode and six refresh crash/replay checks retained for unchanged product", + "unit": "protocol120 owning product suites: 7882 roots retained for unchanged product", + "performance": "no new claim" + }, + "remote_ci": "pending publication; parent coverage failed, normal UT/SCA/both BVT/connectors passed", + "test_sha256": "dbcde8eb46396be86af23a81c904d42300a9d1355092af03018378aa1d931d81" +} diff --git a/docs/design/materialized_view_validation.md b/docs/design/materialized_view_validation.md index 1dd84d10e9a99..84ad49b443ea0 100644 --- a/docs/design/materialized_view_validation.md +++ b/docs/design/materialized_view_validation.md @@ -347,3 +347,13 @@ and [integration results](materialized_view_protocol120_integration_results.json The existing native consumer now has14 cases and the full entrypoint116. Parent95dd4c0d passed ALL CI39145960351 and both connector workflows; these are parent results, distinct from the new integration's CI. + + +## Cross-CN coverage fixture visibility correction + +The [CI diagnosis](materialized_view_ci_triage.md#coverage-ut-cross-cn-view-description-after-source-restore) +and [scoped results](materialized_view_cross_cn_visibility_results.json) document +the commit-frontier handoff required before asserting post-RESTORE metadata on +a Push-mode peer. This changes the existing ordinary-View test only; it does not +change MV semantics or add a performance claim. Remote CI is checked separately +at the published correction head. diff --git a/pkg/tests/sqlintegration/multicn/view_description_test.go b/pkg/tests/sqlintegration/multicn/view_description_test.go index 4cd298fea50e8..c08201968ea1a 100644 --- a/pkg/tests/sqlintegration/multicn/view_description_test.go +++ b/pkg/tests/sqlintegration/multicn/view_description_test.go @@ -94,8 +94,13 @@ func TestViewDescriptionTwoCN(t *testing.T) { require.False(t, rows.Next()) require.NoError(t, rows.Err()) } + // Push mode permits a peer to start at its older applied snapshot. A + // cross-CN freshness assertion needs an explicit commit-frontier handoff; + // this SELECT does not advance the prepared session's DDL generation. + syncCommits := func() { exec(first, "select mo_ctl('cn','synccommit','')") } check := func(width int, value string) { t.Helper() + syncCommits() for _, db := range []*sql.DB{first, second} { for _, name := range []string{"v", "nested"} { var gotWidth int @@ -149,7 +154,13 @@ func TestViewDescriptionTwoCN(t *testing.T) { checkPrepared("varchar(90)") sourceID = identity("src") exec(first, "restore table view_description_two_cn.src {snapshot='view_description_restore'}") - require.NotEqual(t, sourceID, identity("src"), "restore must exercise physical replacement") + restoredID := identity("src") + require.NotEqual(t, sourceID, restoredID, "restore must exercise physical replacement") + syncCommits() + var peerSourceID uint64 + require.NoError(t, second.QueryRowContext(ctx, + "select rel_id from mo_catalog.mo_tables where reldatabase='view_description_two_cn' and relname='src'").Scan(&peerSourceID)) + require.Equal(t, restoredID, peerSourceID, "peer must see restored source before prepared metadata validation") require.Equal(t, viewID, identity("v"), "source restore must not recreate the dependent View") checkPrepared("varchar(60)") check(60, "saved") From 4e537923e5ce7c71728a4cffe03094ead9791b6e Mon Sep 17 00:00:00 2001 From: dengn Date: Mon, 19 Oct 2026 10:58:59 +0800 Subject: [PATCH 5/5] test: preserve prepared session generation in branch consumer cases --- .../materialized_view_branch_admission.md | 12 +++ ...ialized_view_branch_admission_results.json | 80 +++++++++++++------ test/materialized_view/consumers.go | 23 ++++-- 3 files changed, 86 insertions(+), 29 deletions(-) diff --git a/docs/design/materialized_view_branch_admission.md b/docs/design/materialized_view_branch_admission.md index f237d9458463f..9747d9c36e04e 100644 --- a/docs/design/materialized_view_branch_admission.md +++ b/docs/design/materialized_view_branch_admission.md @@ -60,3 +60,15 @@ controls and the real expression-binding precision and SQL-mode controls. checks. Prior race, crash/recovery, compatibility and benchmark captures remain evidence only for unchanged owners; no new performance claim or full native upgrade claim is made by this change. New-head remote CI is separate. + + +## Preserve the prepared DELETE cache boundary + +The first combined harness created its comparison table after PREPARE on the +prepared owner, which advanced that session's DDL generation and masked the +older cached-DELETE regression. This is a test-quality defect, not a new product +fix. Complete all comparison-table DDL before PREPARE and run added branch +queries/mutations on the existing other session. Keep the same prepared handle +and all original source DELETE/provenance/index assertions. Revalidate the final +client against the old branch-reader negative control and both RC/SI candidates; +previous product package/static evidence remains scoped to unchanged sources. diff --git a/docs/design/materialized_view_branch_admission_results.json b/docs/design/materialized_view_branch_admission_results.json index a06cd76fef347..7c0b2d37487ca 100644 --- a/docs/design/materialized_view_branch_admission_results.json +++ b/docs/design/materialized_view_branch_admission_results.json @@ -5,10 +5,11 @@ "source": { "algorithm": "git ls-files; exclude docs/ and *.md; SHA256(path NUL file_sha256 LF), git order", "non_doc_count": 11179, - "non_doc_sha256": "2faf4a9bf20337e643f395466c56bf299a3a88ddbdbf1bfad6c2c5f572648091", - "candidate": "parent50e7f92b plus staged main75ff and working fix; native binary vcs.modified=true; client v2 includes matching NOT NULL id", + "non_doc_sha256": "2e34c0b82f5a30d4be5fbbafe165ea5b3acca04ad5ad0578ffe4e5008dfbf2de", + "candidate": "same native product binary as70b6; all production source blobs unchanged; final v3 client preserves prepared session generation", "old_candidate": "retained protocol120 native binary from the 3b integration capture; affected branch source byte-identical to parent50", - "old_branch_blob": "2f4fc49500bfbef5415960f77fdc7ef5d5e26a76" + "old_branch_blob": "2f4fc49500bfbef5415960f77fdc7ef5d5e26a76", + "native_product_source_change_in_followup": false }, "focused": { "receipt": "oct19-branch-fk-focused.jsonl", @@ -59,10 +60,10 @@ ] }, "native": { - "negative-v2": { - "receipt": "oct19-branch-negative-v2-results.json", - "receipt_sha256": "d44f3e8f6a11751471b51b6a65e2485812afb8450fdb669191704ac6cd5b6972", - "expected": "consumer rejection assertion fails on old binary", + "negative-v3": { + "receipt": "oct19-branch-negative-v3-results.json", + "receipt_sha256": "fc114aa088c5cc911c3f7b4b5d56ea708e669cafdf58f838cdf4ef6142dfb972", + "expected": "old binary fails the required rejection assertion", "consumer_exit": 1, "cases": [ "ordinary native branch readers remain supported" @@ -78,7 +79,7 @@ "mode": "pessimistic", "isolation": "RC", "binary_sha256": "8aab12b303d375e5ddb04307efb0b2ec7431f5a45e9c794dea29684ed5caa5f3", - "client_sha256": "99913d852f87aa38984db1bf6f666c555eea14679b883051d249a4a72a156f79", + "client_sha256": "0a79a617f8508f501043339b4fe252013551c163353793e346b79a5ce2ed6029", "cleanup": [ { "sql": "select count(*) from mo_catalog.mo_database where datname='mv_consumer_validation'", @@ -140,13 +141,13 @@ "second": 0, "primary": 0 }, - "elapsed": 21.469444513320923, + "elapsed": 21.551098585128784, "counterexample_output": "PASS ordinary native branch readers remain supported\nMV branch endpoint: expected rejection\n" }, - "rc": { - "receipt": "oct19-branch-rc-results.json", - "receipt_sha256": "5a2585ac2419473eb70fc55834d2e210ccf71109ab4351c1189c81b52943b572", - "expected": "all consumer checks pass", + "rc-v3": { + "receipt": "oct19-branch-rc-v3-results.json", + "receipt_sha256": "49bf1ca836fe946777383995a25c4cc4726b1d15482ed10ba2e92d54674aca35", + "expected": "all17 cases pass with original cached DELETE owner boundary preserved", "consumer_exit": 0, "cases": [ "ordinary native branch readers remain supported", @@ -178,7 +179,7 @@ "mode": "pessimistic", "isolation": "RC", "binary_sha256": "bf7a0df86bf6af06edf7d62a8cfc4f1f9e7b54940ae254416a0c37781ef4bbb8", - "client_sha256": "99913d852f87aa38984db1bf6f666c555eea14679b883051d249a4a72a156f79", + "client_sha256": "0a79a617f8508f501043339b4fe252013551c163353793e346b79a5ce2ed6029", "cleanup": [ { "sql": "select count(*) from mo_catalog.mo_database where datname='mv_consumer_validation'", @@ -240,12 +241,12 @@ "second": 0, "primary": 0 }, - "elapsed": 21.804412126541138 + "elapsed": 20.96307373046875 }, - "si": { - "receipt": "oct19-branch-si-results.json", - "receipt_sha256": "35f9b29da6c4899c54590e0a0ac8c40cbf5bbbac23b8b7f4d5dc5ab5cd62eb84", - "expected": "all consumer checks pass", + "si-v3": { + "receipt": "oct19-branch-si-v3-results.json", + "receipt_sha256": "ef38dbbf27802b75ca9286bb309180b2fdd9e030ce85663e9d3d937274388527", + "expected": "all17 cases pass with original cached DELETE owner boundary preserved", "consumer_exit": 0, "cases": [ "ordinary native branch readers remain supported", @@ -270,14 +271,14 @@ "error": "", "rows": [ [ - "{\n \"method\": \"GETPROTOCOLVERSION\",\n \"result\": \"dd1dccb4-4d3c-41f8-b482-5251dc7a41bf:120, ee1dccb4-4d3c-41f8-b482-5251dc7a41bf:120\"\n}\n" + "{\n \"method\": \"GETPROTOCOLVERSION\",\n \"result\": \"ee1dccb4-4d3c-41f8-b482-5251dc7a41bf:120, dd1dccb4-4d3c-41f8-b482-5251dc7a41bf:120\"\n}\n" ] ] }, "mode": "optimistic", "isolation": "SI", "binary_sha256": "bf7a0df86bf6af06edf7d62a8cfc4f1f9e7b54940ae254416a0c37781ef4bbb8", - "client_sha256": "99913d852f87aa38984db1bf6f666c555eea14679b883051d249a4a72a156f79", + "client_sha256": "0a79a617f8508f501043339b4fe252013551c163353793e346b79a5ce2ed6029", "cleanup": [ { "sql": "select count(*) from mo_catalog.mo_database where datname='mv_consumer_validation'", @@ -339,7 +340,7 @@ "second": 0, "primary": 0 }, - "elapsed": 21.966458797454834 + "elapsed": 21.312034845352173 } }, "static": { @@ -370,7 +371,7 @@ }, "classification": "comparison id type nullability mismatch; not a product failure or usable negative control; corrected before v2" }, - "remote_ci": "pending publication; parent50 full CI success is historical", + "remote_ci": "pending followup publication;70b6 CI is superseded as current-head proof", "self_review": { "result": "PASS scoped delivery review", "unresolved_conflicts": 0, @@ -378,7 +379,7 @@ "risk": "R2 native endpoint and session-variable contracts; docs R0", "resource_lifecycle": "no new production allocation/wait/owner; existing background executor owns rollback and close", "security": "existing authorization and named-snapshot checks remain first", - "semantic_freshness": "final production and consumer sources unchanged during successful execution; only the discarded comparison fixture differed", + "semantic_freshness": "all product source blobs unchanged from successful product validation; final client v3 native receipts and static checks match final source", "limits": "historical race/upgrade/performance evidence is not relabeled as new-head validation" }, "environment": { @@ -393,5 +394,36 @@ "vet": "go vet -mod=readonly -p=1 -tags matrixone_test ./pkg/sql/plan ./pkg/sql/compile ./pkg/frontend ./test/materialized_view", "lint": "golangci-lint run -c .golangci.yml --new-from-rev origin/main --build-tags matrixone_test --concurrency 2 --timeout 8m ./pkg/sql/plan ./pkg/sql/compile ./pkg/frontend ./test/materialized_view", "native": "existing two-CN controller runs the committed -consumer-check mode with both direct CN endpoints; explicit pessimistic/RC and optimistic/SI configurations are in native receipts" + }, + "superseded_native_capture": { + "head": "70b6ba9e7d59221d5bb59676e21d50aaee130bc6", + "source_hash": "2faf4a9bf20337e643f395466c56bf299a3a88ddbdbf1bfad6c2c5f572648091", + "results": "https://github.com/matrixorigin/matrixone/blob/70b6ba9e7d59221d5bb59676e21d50aaee130bc6/docs/design/materialized_view_branch_admission_results.json", + "limit": "V2 proved branch rejection but its comparison DDL advanced the cached DELETE owner. V3 creates comparison before PREPARE and executes all new branch operations on the existing other session." + }, + "test_harness_followup": { + "parent": "70b6ba9e7d59221d5bb59676e21d50aaee130bc6", + "production_unchanged": true, + "comparison_ddl_before_prepare": true, + "branch_queries_and_mutations_on_other_session": true, + "preserved": [ + "same original prepared DELETE handle", + "remote MV creation", + "affected rows", + "unchanged publication", + "source index maintenance", + "prepared SHOW remote policy test" + ], + "client_static": { + "vet": 0, + "lint": 0 + }, + "lint_summary": "0 issues.", + "runtime": [ + "negative-v3 expected failure", + "RC17", + "SI17" + ], + "original_product_unit_and_static_evidence_reused": true } } diff --git a/test/materialized_view/consumers.go b/test/materialized_view/consumers.go index 9527d06c5014c..3dc4af68d52e3 100644 --- a/test/materialized_view/consumers.go +++ b/test/materialized_view/consumers.go @@ -52,6 +52,8 @@ func runConsumerCases(dsn, secondDSN string) { exec("set time_zone='+00:00'") exec("set delete_opt_to_truncate=1") exec("create table facts(id int primary key,k int unique,skey int,index sk(skey))") + // Complete fixture DDL before PREPARE so the cached DELETE owner stays unchanged. + exec("create table comparison(id int not null,k int,skey int)") const insert = "insert into facts values(1,11,10),(2,22,20)" exec(insert) if secondDSN == "" { @@ -87,10 +89,21 @@ func runConsumerCases(dsn, secondDSN string) { rows("select mo_ctl('cn','synccommit','')") otherExec("create materialized view stored refresh manual as select id,k,skey from facts") rows("select mo_ctl('cn','synccommit','')") - exec("create table comparison(id int not null,k int,skey int)") - if len(rows("data branch diff comparison against comparison")) != 0 { - panic("ordinary branch diff should remain empty") - } + // Branch mutations run on the other session too; they must not invalidate + // the prepared DELETE owner's DDL generation, even on rejected statements. + func() { + result, err := other.QueryContext(ctx, "data branch diff comparison against comparison") + if err != nil { + panic(err) + } + defer result.Close() + if len(decodeRows(result)) != 0 { + panic("ordinary branch diff should remain empty") + } + if err := result.Err(); err != nil { + panic(err) + } + }() pass("ordinary native branch readers remain supported") checkBranchRejection := func() { for _, statement := range []string{ @@ -100,7 +113,7 @@ func runConsumerCases(dsn, secondDSN string) { "data branch merge stored into comparison", "data branch merge comparison into stored", } { - _, err := db.ExecContext(ctx, statement) + _, err := other.ExecContext(ctx, statement) requireServerRejection("MV branch endpoint", err) if !strings.Contains(err.Error(), "materialized view") { panic(err)